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?