Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ms-access和vb.net中的事务处理_Vb.net_Transactions - Fatal编程技术网

ms-access和vb.net中的事务处理

ms-access和vb.net中的事务处理,vb.net,transactions,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()

我正在尝试下面的代码,但没有得到执行

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

我不理解事务。

命令需要知道事务的存在。但在打开连接之前分配事务实例,然后要求连接启动事务。
这样,该命令对事务具有空引用,而不是连接创建的良好实例。此外,当您再次创建该命令时,没有与之关联的事务。
最好使用将事务作为第三个参数的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 

我还更改了您的代码,以使用更安全的方法处理查询。不要使用字符串连接,而是始终使用参数化查询。通过这种方式,您可以避免Sql注入,在解析文本时不会出现问题,并且查询更具可读性。

谢谢,您的代码帮助很大。