Newsgroup: it.comp.lang.visual-basic
Titolo: Recordset disconnessi

Sto cercando di creare una classe (ADO) utilizzando recorset disconnessi.
Ora dovrei gestire attraverso questa classe due tabelle
(es:Testata;Dettaglio).
Lo scopo è quello di consentire all'utente di modificare i recorset di
Testata e Dettaglio in modalità disconnessa e attraverso una stored
riaggiornare le due tabelle
perciò intendo cancellare ed inserire i dati ad ogni operazione prelevandoli
dal recordset disconnesso.
Il recorset contenente i dati della tabella dettaglio andreabbero a popolare
una griglia(attaverso la proprietà datasource), l'inserimento di nuovi
record non crea problemi, ma la cancellazione sì, infatti quando cerco di
cancellare tutti i record all'ultimo ottendo il seguente errore:
 "Run Time -
2147217885
 - Un handle di riga fa riferimento ad una riga
eliminata o ad una riga contrassegnata per l'eliminazione"
se potete darmi qualche consiglio sul corretto utilizzo dei recordset
disconnessi e dei relativi metodi di gestione (Add,Update,Delete)
Grazie mille (allego parte del codice della classe business dove istanzio il
recordset ed effetto le operazioni di salvataggio e cancellazione"
Option Explicit
' Recordsets
Private m_cnn As Connection
Private WithEvents m_rsTestataByKey As Recordset
Private WithEvents m_rsAllTestataKeys As Recordset
Private WithEvents m_rsDettagliByTestata As Recordset
Const TestataByKey = "TestataByKey"
Const AllTestataKeys = "AllTestataKeys"
Const DettagliByTestata = "DettagliByTestata"
Public Enum BussinessEnum
    cmsTestata = 1
    cmsDettaglio = 2
End Enum
Private m_lID As Long
Public Property Get ID() As Long
    ID = m_lID
End Property
Public Property Let ID(ByVal lID As Long)
    m_lID = lID
    DataMemberChanged TestataByKey
    DataMemberChanged DettagliByTestata
End Property
Private Sub Class_GetDataMember(DataMember As String, Data As Object)
    Select Case DataMember
        Case DettagliByTestata
            If m_rsDettagliByTestata.State = adStateOpen Then
                m_rsDettagliByTestata.Close
            End If
                With m_rsDettagliByTestata
                    .ActiveConnection = m_cnn
                    .CursorLocation = adUseClient
                    .CursorType = adOpenKeyset
                    .LockType = adLockBatchOptimistic
                    .Source = "SELECT * FROM Dettaglio WHERE (IDTestata = "
& m_lID & ") "
                    .Open
                    .ActiveConnection = Nothing
                End With
                Set Data = m_rsDettagliByTestata
        Case TestataByKey
            If m_rsTestataByKey.State = adStateOpen Then
                 m_rsTestataByKey.Close
            End If
                With m_rsTestataByKey
                    .ActiveConnection = m_cnn
                    .CursorLocation = adUseClient
                    .CursorType = adOpenKeyset
                    .LockType = adLockBatchOptimistic
                    .Source = "SELECT * FROM Testata WHERE (IDTestata = " &
m_lID & ")"
                    .Open
                    .ActiveConnection = Nothing
                End With
                Set Data = m_rsTestataByKey
        Case AllTestataKeys
                If m_rsAllTestataKeys.State = adStateOpen Then
                    m_rsAllTestataKeys.Close
                End If
                With m_rsAllTestataKeys
                    .ActiveConnection = m_cnn
                    .CursorLocation = adUseClient
                    .CursorType = adOpenKeyset
                    .LockType = adLockOptimistic
                    .Source = "SELECT IDTestata, Numero, Cliente FROM
Testata ORDER BY Cliente"
                    .Open
                End With
                Set Data = m_rsAllTestataKeys
    End Select
End Sub
Public Sub Add(Optional iDataType As CMSBODTenum = cmsTestata)
    Select Case iDataType
        Case cmsTestata
            ' Create a recordset with no records
            ID = 0
            ' Add the new record to the recordset
            m_rsTestataByKey.AddNew
        Case cmsDettaglio
            ' Add the new record to the recordset
            m_rsDettagliByTestata.AddNew
            ' Set the Person ID field as the foreign key
            m_rsDettagliByTestata!IDTestata = ID
            m_rsDettagliByTestata!IDDettaglio = BuildKeyDettaglio
    End Select
End Sub
Public Sub Delete(Optional iDataType As CMSBODTenum)
'On Error GoTo errhandler
    Select Case iDataType
        Case cmsTestata
            ' Delete the current record
            m_rsTestataByKey.Delete
            ' Ensure the combo knows the record is gone
            DataMemberChanged AllTestataKeys
            ' Create a recordset with no records
            ID = 0
        Case cmsDettaglio
            m_rsDettagliByTestata.Delete adAffectCurrent
            If EmptyRS(m_rsDettagliByTestata) = True Then
                Add cmsDettaglio
            End If
End Select
'errhandler:
'MsgBox Err.Description
End Sub

disconnessi e dei relativi metodi di gestione (Add,Update,Delete)
Innanzi tutto grazie per il codice, non l' ho guardato per mancanza di tempo,
pero' ti segnalo questi due links, che mi sono stati molto utili:
Store ADO Recordset Data Without a Database
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dninvb00/html/ADORecordset.asp
HOWTO: Using ADO Disconnected and Persisted Recordsets (Q195082)
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q195082
-- 
hth, hal