Sto cominciando ad usare questi due metodi, vi mostro un esempio del mio codice per vedere se ho capito bene il concetto:
codice:
Dim conn As New OleDb.OleDbConnection(StringaConnessione)
conn.Open()
Dim transaction As OleDb.OleDbTransaction = conn.BeginTransaction()
Dim cmd As New OleDb.OleDbCommand("INSERT INTO utenti (cognome, nome) VALUES (@cognome, @nome)", conn, transaction)
Try
cmd.Connection = conn
cmd.Parameters.Add("@cognome", OleDb.OleDbType.VarChar).Value = Cognome.Text
cmd.Parameters.Add("@nome", OleDb.OleDbType.VarChar).Value = Nome.Text
If cmd.ExecuteNonQuery() > 0 Then
transaction.Commit()
MessageBox.Show("Nuovo utente salvato con successo.", "Utente salvato", MessageBoxButtons.OK)
Else
transaction.Rollback()
End If
Catch
MessageBox.Show("Si è verificato un errore durante il salvataggio dei dati per il nuovo utente." & vbNewLine & Err.Description, "Errore" & Err.Number, MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
transaction.Rollback()
Finally
cmd.Connection.Close()
cmd = Nothing
conn.Close()
conn = Nothing
End Try
Utilizzando questo codice dovrei essere sicuro che il nuovo utente venga realmente salvato nel Db solo ed esclusivamente se la ExecuteQuery(che esegue la INSERT "nella transaction" e non nel Db) va a buon fine. Inoltre, utilizzando la query parametrica, dovrei essere sicuro che qualsiasi carattere(vedi apici) inserito non mi possa creare problemi di SQL-Injection, non ho la necessità di fare una Replace degli apici...
Domanda1: Ho capito tutto, niente o poco
?
Domanda2: la transaction ha senso solo per una INSERT, UPDATE e DELETE? oppure ha senso anche per una SELECT?
Domanda "di curiosità": Se sto facendo un elenco di 10.000 prodotti(p.es), è ovvio che ci vorrà un certo tempo. Se nel frattempo un utente di un'altra postazioni inserisce il prodotto numero 10.001 c'è un modo di farlo rientrare nella SELECT che ho fatto inizialemente sui 10.000 prodotti?