2015-04-13 2 views
-1

J'essaie le code ci-dessous mais je ne suis pas exécuté.transaction dans ms access et vb.net

Private Sub btnsave_Click(sender As Object, e As EventArgs) Handles btnsave.Click 
    Using con As New OleDbConnection(connectionString) 
     Dim tra As OleDbTransaction = Nothing 

     Try 
      con.Open() 
      cmd.Transaction = tra 
      tra = con.BeginTransaction 
      Dim sqlstr As String = "insert into category(cname,comment) values('" + txtcategory.Text + "','" + txtcomment.Text + "')" 
      cmd = New OleDb.OleDbCommand(sqlstr, con) 
      cmd.ExecuteNonQuery() 

      Dim sql As String = "UPDATE tblInvoices SET avail = 1 WHERE (cname = txtcategory.Text)" 
      cmd = New OleDb.OleDbCommand(sqlstr, con) 
      cmd.ExecuteNonQuery() 
      tra.Commit() 

     Catch ex As Exception 
      MsgBox(ex.Message) 
      Try : tra.Rollback() : Catch : End Try 

     End Try 


    End Using 
End Sub 

Je ne comprends pas les transactions.

Répondre

0

La commande doit connaître l'existence d'une transaction. Mais vous affectez l'instance de transaction avant l'ouverture de la connexion, puis demandez à la connexion de démarrer la transaction.
De cette façon, la commande a une référence nulle pour la transaction et non la bonne instance créée par la connexion. De plus, lorsque vous créez à nouveau la commande, aucune transaction n'est associée à celle-ci.
Mieux utiliser le constructeur OleDbCommand qui prend une transaction en tant que troisième paramètre

Private Sub btnsave_Click(sender As Object, e As EventArgs) Handles btnsave.Click 
    Using con As New OleDbConnection(connectionString) 
     Dim tra As OleDbTransaction = Nothing 

     Try 
      con.Open() 
      tra = con.BeginTransaction 
      Dim sqlstr As String = "insert into category(cname,comment)" & 
            " values(@cat, @com)" 
      cmd = New OleDb.OleDbCommand(sqlstr, con, tra) 
      cmd.Parameters.Add("@cat", OleDbType.VarWChar).Value = txtcategory.Text 
      cmd.Parameters.Add("@com", OleDbType.VarWChar).Value = txtcomment.Text 
      cmd.ExecuteNonQuery() 

      Dim sql As String = "UPDATE tblInvoices SET avail = 1 " & 
           "WHERE cname = @cat" 
      cmd = New OleDb.OleDbCommand(sqlstr, con, tra) 
      cmd.Parameters.Add("@car", OleDbType.VarWChar).Value = txtcategory.Text 
      cmd.ExecuteNonQuery() 
      tra.Commit() 

     Catch ex As Exception 
      MsgBox(ex.Message) 
      tra.Rollback() 
     End Try 
    End Using 
End 

J'ai aussi changé votre code pour utiliser une approche plus sûre à vos questions. Au lieu d'utiliser une concaténation de chaînes, utilisez TOUJOURS une requête paramétrée. De cette façon, vous êtes à l'abri de Sql Injection, vous n'avez pas de problèmes avec les textes d'analyse et vos requêtes sont plus lisibles.