none
Transaction和SqlCommandBuilder的問題 RRS feed

  • 問題

  • :::當我Insert/Delete/Update的SQL語令透過SqlCommandBuilder

    產生出來時,並且將SqlTransaction指定給GetInsertCommand.Transaction時,

    出現:

    當指定給命令的連接為擱置的本機交易時,ExecuteReader 需要連接以交易。命令的 Transaction 屬性尚未初始化。

    的訊息,請問各位,是否Transaction的使用方式,不能和SqlDataAdapter,DataSet

    這種模式同時使用,只能夠單一SqlCommand指令來使用???假如從

    SqlCommandBuilder取出自動產生的SQL指令時,再放入SqlDataAdapter時,

    得還要再建立SQL指令內的參數(@p1,@p2.....),是否有兩全其美的辦法???

    程式如下:

        Dim cn As New SqlConnection("server=db-machine;database=exrfil;user id=sa;password=sa")
        Dim cmd As New SqlCommand("select * from orders", cn)
        Dim da As New SqlDataAdapter
        Dim ds As New DataSet
        Dim cb As New SqlCommandBuilder
        Dim tx As SqlTransaction

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            cb.DataAdapter = da
            da.SelectCommand = cmd
            da.Fill(ds, "orders")
        End Sub

        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            cn.Open()
            tx = cn.BeginTransaction
            With cb
                .DataAdapter = da
                .GetInsertCommand.Transaction = tx
                .GetDeleteCommand.Transaction = tx
                .GetUpdateCommand.Transaction = tx
            End With
            da.Update(ds, "orders")

            tx.Commit()
        End Sub

    2006年9月2日 上午 10:17

解答

  • HI,

    把程式改成以下的樣子就可以了:

        Dim cn As New SqlConnection("Data Source=.;Initial Catalog=Northwind;user id=sa;password=sa")
        Dim da As SqlDataAdapter = New SqlDataAdapter("select * from orders", cn)
        Dim cb As SqlCommandBuilder = New SqlCommandBuilder(da)
        Dim ds As New DataSet
        Dim tx As SqlTransaction

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            da.Fill(ds)
        End Sub

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

            cb.GetInsertCommand.Connection.Open()
            tx = cb.GetInsertCommand.Connection.BeginTransaction


            cb.GetInsertCommand.Transaction = tx
            cb.GetDeleteCommand.Transaction = tx
            cb.GetUpdateCommand.Transaction = tx

            da.Update(ds)

            tx.Commit()

            cb.GetInsertCommand.Connection.Close()
        End Sub

    tihs

    2006年9月7日 上午 02:27

所有回覆

  • HI,

    把程式改成以下的樣子就可以了:

        Dim cn As New SqlConnection("Data Source=.;Initial Catalog=Northwind;user id=sa;password=sa")
        Dim da As SqlDataAdapter = New SqlDataAdapter("select * from orders", cn)
        Dim cb As SqlCommandBuilder = New SqlCommandBuilder(da)
        Dim ds As New DataSet
        Dim tx As SqlTransaction

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            da.Fill(ds)
        End Sub

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

            cb.GetInsertCommand.Connection.Open()
            tx = cb.GetInsertCommand.Connection.BeginTransaction


            cb.GetInsertCommand.Transaction = tx
            cb.GetDeleteCommand.Transaction = tx
            cb.GetUpdateCommand.Transaction = tx

            da.Update(ds)

            tx.Commit()

            cb.GetInsertCommand.Connection.Close()
        End Sub

    tihs

    2006年9月7日 上午 02:27
  • 你好:
    我按照您的意思做一次
    If是一個DATATABLE,沒問題
    但我要連結多個TABLE
    如:銷貨數量,必須扣除庫存量

    目前遭遇到的是:
    銷貨不會產生,但會扣除庫存量
    我大約知道,下面兩句的關係,已造成更新資料庫
    ds.Tables("Product").AcceptChanges()
    ds.Tables("ProdPlace").AcceptChanges()
    但我不知道TRANSCATION,應如何擺放
    程式略簡如下:把連線字串及SQL字串拿掉,才不會太長

           Dim da As SqlDataAdapter = New SqlDataAdapter
           Dim bcProduct As bcProduct = New bcProduct
           Dim tx As SqlTransaction
           da.InsertCommand.Connection.Open()
            tx = da.InsertCommand.Connection.BeginTransaction()
            da.InsertCommand.Transaction = tx
            bcProduct.daVaryProduct.UpdateCommand.Transaction = tx
            

            da.Update(ds, "BNIB")
            bcProduct.daVaryProduct.Update(ds, "Product")
            ds.Tables("BNIB").AcceptChanges()
            ds.Tables("Product").AcceptChanges()
      tx.Commit()
    謝謝
    2007年1月29日 下午 04:15
  • HI,

    基本上在呼叫DataTable的AcceptChanges方法時Transaction就結束了, 所以如果要對兩個資料表做更新, 而且要加上Transaction控制, 一種是用Stored Procedure, 一種是用Trigger

    tihs

    2007年1月31日 上午 03:57
  • 謝謝老師!
    我是你的學生
    是我自己把transcation下到另一層
    造成無法更新
    2007年2月4日 上午 02:45
  • HI,

    那您的問題是否已經解決了?

    tihs

    2007年2月5日 上午 03:49
  • 應該是解決了,測試中!
    謝謝
    2007年2月8日 上午 09:49