Ho un GridView.
Recupero i dati in un DataTable utilizzando System.Data.Odbc.
Collego la griglia al datatable.
Il problema sorge nell'aggiunta nuovo record. Ho pensato di personalizzare il comando di inserimento e di lasciare inalterati i comandi di update e cancel creati con CommandBuilder.
Il messaggio di errore è:
ExecuteReader richiede che il comando abbia una transazione quando la connessione assegnata al comando è in una transazione locale in sospeso. La proprietà Transaction del comando non è stata inizializzata.
il codice incriminato è:
codice:
Private Sub DataTableUpdate(stringaConnessione As String, sql As String, dt As DataTable, Optional commit As Boolean = True)
Dim connessione As o.OdbcConnection = Nothing
Dim DataAdapter As o.OdbcDataAdapter = Nothing
Dim Transazione As o.OdbcTransaction = Nothing
Dim CommandBuilder As o.OdbcCommandBuilder = Nothing
'comando di inerimento personalizzato
Dim cmdInsert As o.OdbcCommand = Nothing
Try
connessione = New o.OdbcConnection(stringaConnessione)
connessione.Open()
Transazione = connessione.BeginTransaction()
cmdInsert = connessione.CreateCommand()
cmdInsert.CommandText = "insert into conto (id_utente, data_operazione, data_valuta, id_operazione, valore_operazione, dettaglio_operazione, id_numero_operazione) values (?, ?, ?, ?, ?, ?, ?) "
cmdInsert.Transaction = Transazione
Dim id_numero_operazione As Integer = msodbc.ProssimoID(cmdInsert, "conto", "id_numero_operazione")
cmdInsert.Parameters.Clear()
'utilizza i valori correnti del campo
cmdInsert.Parameters.Add("@p1", Odbc.OdbcType.Int, 0, "id_utente")
cmdInsert.Parameters.Add("@p2", Odbc.OdbcType.DateTime, 0, "data_operazione")
cmdInsert.Parameters.Add("@p3", Odbc.OdbcType.DateTime, 0, "data_valuta")
cmdInsert.Parameters.Add("@p4", Odbc.OdbcType.Int, 0, "id_operazione")
cmdInsert.Parameters.Add("@p5", Odbc.OdbcType.Decimal, 0, "valore_operazione")
cmdInsert.Parameters.Add("@p6", Odbc.OdbcType.VarChar, 250, "dettaglio_operazione")
cmdInsert.Parameters.Add("@p7", Odbc.OdbcType.Int).Value = id_numero_operazione
DataAdapter = New o.OdbcDataAdapter(sql, connessione)
CommandBuilder = New o.OdbcCommandBuilder(DataAdapter)
'CommandBuilder.QuotePrefix = "[" : CommandBuilder.QuoteSuffix = "]"
CommandBuilder.ConflictOption = ConflictOption.OverwriteChanges
DataAdapter.DeleteCommand = CommandBuilder.GetDeleteCommand()
'DataAdapter.InsertCommand = CommandBuilder.GetInsertCommand()
DataAdapter.InsertCommand = cmdInsert
DataAdapter.UpdateCommand = CommandBuilder.GetUpdateCommand()
DataAdapter.DeleteCommand.Transaction = Transazione
DataAdapter.InsertCommand.Transaction = Transazione
DataAdapter.UpdateCommand.Transaction = Transazione
DataAdapter.Update(dt)
If commit Then
Transazione.Commit()
Else
Transazione.Rollback()
End If
Catch ex As Exception
Throw
Finally
If connessione IsNot Nothing Then connessione.Dispose()
If DataAdapter IsNot Nothing Then DataAdapter.Dispose()
If CommandBuilder IsNot Nothing Then CommandBuilder.Dispose()
End Try
End Sub
Mi dareste una mano a risolvere?