Newsgroup: it.comp.lang.visual-basic
Titolo: Eventi RowUpdating e RowUpdated di un DataAdapter generico

Ciao.
Nel mio codice ho creato un dataadapter generico in questo modo:
Dim GenericDataAdapter As IDbDataAdapter
Per riempire un Dataset indipendentemente dal tipo di database.
Riesco a gestire tutto ma non riesco a gestire gli eventi RowUpdating e
RowUpdated che di solito vengono generati dal SqlDataAdapter e da
OleDbDataAdapter in fase di aggiornamento di una tabella.
Come posso fare?
Grazie
Skysurfer

[Skysurfer] scrisse:

Hai provato a dimensionarlo WithEvents ?

 Come posso fare?
ah, se ci riesci, vedi se riesci ad illuminarmi su questo dettaglio:
Sul solito libro di balena, c'è scritto che si può sfruttare l'evento
RowUpdating per modificare il comando sql del dataadapter, e questa cosa può
essere particolarmente utili per le operazioni di update, se non fosse che
non ci sono assolutamente riuscito!
Io genero al run time il comando di update del dataadapter prima di lanciare
l'update, lo stesso codice, eseguito nell'evento rowupdate fallisce
miseramente, sollevando un errore relativo alla mancata corrispondenza dei
parametri..
Ti auguro maggiore fortuna...
Salutoni
Sergio

 ha scritto nel messaggio
news:b717l4$9ndo9$1...@ID-173193.news.dfncis.de...

Yes... non gli piace perchè in realtà sto usando un'interfaccia e quindi mi
dice "la variabile WithEvents non genera eventi"
Grazie
Ciao
Skysurfer

 quindi mi dice "la variabile WithEvents non genera eventi"
Già, non ha tutti i torti neanche lui.....
L'unica che mi viene in mente, a questo punto, è una classe che contenga i
due diversi dataadapter, e, al verificarsi dell'evento su uno dei due lo
scateni a sua volta, ma mi suona tanto di ereditarietà alla moda di vb6....
Speriamo che qualcuno abbia una idea migliore...
Salutoni
Sergio

 parametri..
Io ho provato cosě e funziona:
Ho messo 2 button e 1 Datagrid su un form.
Il Button1 seleziona tutti i record dalla tabella Products di Northwind e li
visualizza in un datagird.
Il Button2 crea il comando di Update usando un commandBuilder ed esegue
l'update.
Poi nel metodo RowUpdating cambio il comando impostando un nuovo testo e la
connection del comando originale.
In questo modo qualsiasi modifica faccio sulla griglia, il comando che viene
mandato č sempre quello (cioč imposto Productname a Chai1 nel prodotto con
ID=1)
Ciao
Inherits System.Windows.Forms.Form
Dim cnStr As String = "Integrated Security=SSPI;Persist Security Info=True;"
& _
"Data Source=GIAN;Initial Catalog=Northwind;"
Dim cn As New SqlClient.SqlConnection(cnStr)
Dim cmd As SqlClient.SqlCommand
Dim ds As New DataSet()
Dim WithEvents da As New SqlClient.SqlDataAdapter()
...
Private Sub da_RowUpdated(ByVal sender As Object, ByVal e As
System.Data.SqlClient.SqlRowUpdatedEventArgs) Handles da.RowUpdated
    MessageBox.Show(e.Command.CommandText)
End Sub
Private Sub da_RowUpdating(ByVal sender As Object, ByVal e As
System.Data.SqlClient.SqlRowUpdatingEventArgs) Handles da.RowUpdating
    e.Command = New SqlClient.SqlCommand("UPDATE Products SET
ProductName='Chai1' WHERE ProductID=1", e.Command.Connection)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
    cmd = cn.CreateCommand
    cmd.CommandText = "SELECT * FROM Products"
    da.SelectCommand = cmd
    da.Fill(ds, "Prod")
    DataGrid1.DataSource = ds.Tables("Prod")
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button2.Click
    Dim cmdBld As New SqlClient.SqlCommandBuilder()
    cmdBld.DataAdapter = da
    da.UpdateCommand = cmdBld.GetUpdateCommand
    da.Update(ds, "Prod")
End Sub
End Class

 End Sub
Sě, nelle varie prove che ho fatto, risultava che questo approccio
funzionava. Quello che non funzionava era di creare un apposito command,
dagli una istruzione sql del tipo:
update x=?, y=? where id=?
e aggiungendo al command i tre parametri...
Nota a margine: non posso fare una istruzione sql "diretta", perchč non so a
priori se il campo č di tipo numerico o stringa o altro.
Seconda nota a margine: la stessa tecnica, utilizzata prima di lanciare
l'update del data adapter funziona che č un piacere.
Terza nota a margine: ci ho picchiato la testa dalle ore 20.00 di lunedě
alle ore 02:00 di martedě, a questo punto o qualcuno mi spiattella su un
piatto d'argento la soluzione, oppure rinuncio all'ottimizzazione ;-)
Salutoni
Sergio

 Sergio