The only way I have found to solve the problem is to dynamically create and destroy the CRecordSet object. Then If I found it is timeout I destroy and create it again before calling Open().

This solves the problem but is only a way to surround the problem.

I still don't know where is and/or what is that hidden link between the recordset object and the server that allows the server to remember the recordset was timeout even though the recorset is closed.