IDbDataAdapter e RowUpdating

  • Thread starter Thread starter Maurizio
  • Start date Start date
M

Maurizio

Ciao a tutti,
sto cercando di realizzare una classe (ProviderFactory) che mi consenta di
scrivere del codice a prescindere dal provider utilizzato per accedere ai
dati. Al momento gestisco i classici SqlClient, ODBC, OleDb e Oracle.
Ho dichiarato nel codice client le variabili utilizzando le interfacce
(IDbConnection, IDbCommand, ecc..) Il codice funzionava alla grande finchè
non mi sono imbattuto nel seguente problema:

IDbDataAdapter non supporta gli eventi RowUpdating e RowUpdated, a
differenza degli equivalenti oggetti (SqlDataProvider, ecc...).
Tali eventi sono ovviamente indispensabili per eseguire delle update
complesse o anche per solo scopo di debug.
Come posso fare a scrivere del buon codice ObjectOriented senza rieseguire
il cast all'indietro ?

Ogni idea è ben accetta. Grazie

Maurizio
 
Quale e' il problema usando la classe astratta DataAdapter come base class e
fargli implementare la IDbDataAdapter come fa il framework? (magari mi sono
perso qualcosa...)

HTH
 
L'idea è di avere nel codice client delle istruzioni come le seguenti:

Dim pf As New MyProviderFactory
Dim cb As MyCommandBuilder

Dim cn As IDbConnection
Dim cmm As IDbCommand
Dim da As IDataAdapter
Dim db As IDbDataAdapter
Dim currDs As DataSet

Dim Connection As String
Dim SqlCommand As String

Connection = TxtConnection.Text
SqlCommand = TxtStatement.Text

pf.Provider = ProviderType.SqlServer

cn = pf.CreateConnection(Connection)
da = pf.CreateDataAdapter(SqlCommand, cn)
db = CType(da, IDbDataAdapter)
currDs = New DataSet
db.Fill(currDs)
DGData.DataSource = currDs
currDataSet = currDs

Tranne dove è specificato il tipo di connessione (pf.Provider =
ProviderType.SqlServer) il codice è assolutamente generico e prescinde dal
provider utilizzato. La mia idea è di far uso degli eventi esposti dai
DataAdapter (RowUpdating, RowUpdated) ma, utilizzando il codice precendete,
non posso agganciarmi in quanto IDbDataAdapter non espone gli eventi. Ho
verificato che anche la classe base DBDataAdpater non espone alcun evento.
 
Ti consiglio di dare un'occhiata alla bella presentazione di Andrea
Saltarello su ado.net al link:
http://www.ugidotnet.org/workshops/workshops_read.aspx?WorkshopID=5

Uno degli esempi è proprio chiamato AbstractADO per realizzare ciò che vuoi.

Il problema principale è che le interfacce delle ado supportano il minimo
comun denominatore delle classi Sql, Oledb, Oracle,...
Perciò la risposta non può essere quella più ovvia di usare le interfacce
come mezzo per arrivare a sfruttare la totale potenza dei vari provider.
Per esempio Sql supporta ExecuteXmlReader e tu potresti decidere di
sopperire alla mancanza di questo metodo negli altri provider.

Un buono spunto viene da quell'esempio di Andrea.

--
Raffaele Rialdi
Microsoft .NET MVP http://mvp.support.microsoft.com
UGIdotNET - User Group Italiano .NET http://www.ugidotnet.org
 
Back
Top