Ho una classe astratta che definisce diversi metodi relativi alla gestione delle connessioni e operazioni verso i database. Ho creato un paio di classi che la utilizzano, una per SQL CE e una "generica" per i db con connessione OLE.

Il problema è questo metodo (definito nella mia classe derivata cDbOle):
 public override IDbDataAdapter GetAdapter(string sql)
        {
            if (!ConnectionOpen())
                return null;

            OleDbCommand cmd = new OleDbCommand(sql, (OleDbConnection)Cnn);

            cmd.CommandType = CommandType.Text;
            if (_trans != null)
                cmd.Transaction = (OleDbTransaction)_trans;
            OleDbDataAdapter da = new OleDbDataAdapter(cmd);
            using (OleDbCommandBuilder cb = new OleDbCommandBuilder(da))
            {
                cb.QuotePrefix = "[";
                cb.QuoteSuffix = "]";
                da.InsertCommand = cb.GetInsertCommand();
                da.DeleteCommand = cb.GetDeleteCommand();
                da.UpdateCommand = cb.GetUpdateCommand();
            }

            return da;
        }


In pratica l'oggett "da", finchè non viene ritornato, contiene correttamente gli InsertCommand ed UpdateCommand ma una volta che me lo ritorno, entrambi i commando sono nulli (credo sia legato al tipo IDbDataAdapter che è implementato da OleDbDataAdapter). Non capisco come uscirne... un aiuto?

"This message was written using 100% recycled electrons"
11.886 messaggi dal 09 febbraio 2002
Contributi
Hey! Ma dov'eri finito?!? Come stai??


In pratica l'oggett "da", finchè non viene ritornato, contiene correttamente gli InsertCommand ed UpdateCommand ma una volta che me lo ritorno, entrambi i commando sono null


Il problema si verifica perché con il blocco using stai facendo il Dispose dell'OleDbCommandBuilder. Sono andato a vedermi il sorgente per avere prova di questo, e infatti risulta che al Dispose (seppur indirettamente) vengono reimpostati a null tutti i comandi sul DataAdapter. Ecco il punto:

https://github.com/Microsoft/referencesource/blob/user/rbhanda/referencesource472/System.Data/System/Data/Common/DBCommandBuilder.cs#L1324

Forse dovresti restituire un DbCommandBuilder anziché un IDbDataAdapter. In questo modo puoi preservare i comandi e comunque puoi accedere al data adapter perché il DbCommandBuilder espone una proprietà DataAdapter.

Oppure restituisci un tuo tipo IDataAdapterAccessor. Creati una classe che implementi questa interfaccia e nel suo costruttore gli fai accettare un data adapter. Il dbcommandbuilder te lo crei lì e lo distruggerai solo alla fine, quando verrà invocato il Dispose di questa tua classe.

ciao,
Moreno
Modificato da BrightSoul il 11 marzo 2019 21:00 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.