ms访问和vb.net中的事务

时间:2015-04-13 21:09:50

标签: vb.net transactions

我正在尝试以下代码但未执行。

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

我不明白这些交易。

1 个答案:

答案 0 :(得分:0)

该命令需要知道事务的存在。但是,在打开连接之前分配Transaction实例,然后请求连接启动事务 通过这种方式,该命令对事务具有空引用,而不是由连接创建的良好实例。此外,当您再次创建命令时,没有与之关联的事务 更好地使用将Transaction作为第三个参数的OleDbCommand构造函数

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 

我还更改了您的代码,以便对查询使用更安全的方法。而不是使用字符串连接使用ALWAYS参数化查询。通过这种方式,您可以安全地使用Sql Injection,解决文本时没有问题,并且您的查询更具可读性。