Ho un bel problemino su una classe creata da me che dovrebbe usare un metodo Save() per salvare i suoi parametri nel database.
Per semplificare :

Ho due classi, la classe Articolo e la classe Connessione

Nella classe Connessione ho 2 metodi,
e sono rispettivamente :

codice:
'// restituisce un recordset disconnesso
Public Function RetrieveRS(sSQL)
	Dim objConn, objRS
	Set objConn = Server.CreateObject("ADODB.CONNECTION")
	Set objRS = Server.CreateObject("ADODB.RecordSet")
	objConn.ConnectionString = sConn
	objConn.Open
	objRS.CursorLocation = adUseClient
	objRS.CursorType = adOpenStatic	 'adOpenKeyset(1)
	objRS.LockType = adLockBatchOptimistic
	objRS.Open sSQL, objConn, , , adCmdText
	Set objRS.ActiveConnection = Nothing
	Set RetrieveRS = objRS.clone
	Set objRS = Nothing
	Set objConn = Nothing
End Function

codice:
'// dovrebbe salvare nel db un recordset disconnesso
Public Sub SaveRS(objRS)
	Dim objConn
	Set objConn = Server.CreateObject("ADODB.CONNECTION")
	objConn.ConnectionString = sConn
	objConn.Open
	Set objRS.ActiveConnection = objConn
	objRS.UpdateBatch
	Set objRS = Nothing
	Set objConn = Nothing
End Sub
Queste due classi io le utilizzo dalla classe Articolo che ha come parametri :
iId | sTitle | sText

e come metodi :
Load() e Save()

codice:
Public Sub Load()
if iId > 0 then ' Modifica
			strSQL = "Select * From Articoli Where art_ID = "& iId
		else ' Crea Nuovo
			strSQL = "Select * From Articoli Where art_ID = 0"
		end if
	Set objData = New Connessione
	objData.ConnectionString = sConn 
	Set objRS = objData.RetrieveRS(strSQL)

	With objRS
		If Not .EOF Then ' Load
			.MoveFirst
				
			iId = cInt(objRS("art_ID"))
			sTitle = Trim(objRS("art_titolo"))
			sText = Trim(objRS("art_testo"))
				
		End If
	End With
		
	If IsObject(objData) Then Set objData = Nothing	
	If IsObject(objRS) Then Set objRS = Nothing
End Sub
codice:
Public Sub Save()		
if iId > 0 then ' Modifica
			strSQL = "Select * From Articoli Where art_ID = "& iId
		else ' Crea Nuovo
			strSQL = "Select * From Articoli Where art_ID = 0"
		end if		
	Set objData = New Connessione
	Set objRS = Server.CreateObject("ADODB.Recordset")
	objData.ConnectionString = sConn
	Set objRS = objData.RetrieveRS(strSQL)
		
		
	If objRS.EOF = True And objRS.BOF = True Then 
		objRS.AddNew	
	End If
	if objRS.state = 1 then
		objRS("art_titolo") = sTitle
		objRS("art_testo") = sText		
		objRS.Update
	
		objData.SaveRS(objRS)	
	end if

		
	If IsObject(objData) Then Set objData = Nothing	
	If IsObject(objRS) Then Set objRS = Nothing		
		
End Sub
Il problema è sul Save()
Ogni tanto lo fa, ogni tanto no.
Il problema lo da nella riga del metodo Save(), dove i campi del recordset disconnesso vengono modificati.
codice:
	objRS("art_titolo") = sTitle
	objRS("art_testo") = sText
i campi nel db esistono, quindi teoricamente esistono con quel nome anche nel recordset disconnesso...

e l'errore è questo :

Microsoft Cursor Engine (0x80040E21)
Si sono verificati errori in un'operazione composta da più passaggi. Controllare i singoli valori di stato.


Cosa posso fare?

p.s. la variabile sConn è impostata dalla pagine che istanzia la classe Articolo.