none
同時有兩個資料表都新增一筆記錄,這樣用對嗎? RRS feed

  • 問題

  • SQLServer 2005 express + ASP.Net 2.0 + .Net framework 2.0

     

    狀況是這樣的:

    假設有 A, B 二個資料表,它們的資料某些東西必須一致

    因此假設 A 資料表在 INSERT 時發生錯誤,則除了 RollBack 本身以外,還需 RollBack B資料表,

    若 B 資料表在 INSERT 時發生錯誤亦然。

    那麼以下是我的程式碼片段,不知道這樣對不對:  (因為有發生點小問題,怪怪的)

    Code Snippet

     

    10 Dim conn As New SqlConnection(.....)

    10 conn.Open()

    11 Dim cmd As New SqlCommand("", conn, conn.BeginTransaction(IsolationLevel.Snapshot))

    12

    13 cmd.CommandText = "新增 A 資料表的 Sql 字串"

    14 Try
    15     cmd.ExecuteNonQuery()
    16 Catch ex As Exception
    17     cmd.Transaction.Rollback()  ← 實際程式碼中有 Try Rollback
    18     conn.Close()

    19     Exit Function
    20 End Try

    21

    22 cmd.CommandText = "新增 B 資料表的 Sql 字串"

    23 Try
    24     cmd.ExecuteNonQuery()
    25 Catch ex As Exception
    26     cmd.Transaction.Rollback()  ← 實際程式碼中有 Try Rollback
    27     conn.Close()

    28     Exit Function
    29 End Try
    30

    31 cmd.Transaction.Commit()

     

     

    以下是我的測試

    我故意在新增 A 資料表時隨意指定一個與原有資料一樣的 PK 欄位的值,造成 PK 資料重複的錯誤,然後執行。之後我去查詢資料庫的內容,並無任何資料被新增,這是對的。

    但我用相同的方法也在新增 B 資料表的地方故意製造 PK 值重複的錯誤(這次 A 的地方不製造錯誤),經過反覆多次的測試結果為 B 資料表試完全不會有新增的資料門錯,但是 A 資料表確有時候會有新增資料,有時候不會;我也觀察不出來是什麼情形下會有,什麼情形下沒有,就一直怪怪的。不是在 Commit() 之前都不會有任何資料寫入的嗎??

     

    是我 ADO 的用法錯了嗎?

    若這樣用法不對,那如何才是正確的呢?

     

    謝謝喔~

    2008年4月30日 上午 07:12

解答

  • string strCommand=

    '「INSERT INTO Table1(Field1,Filed2...),

                  VALUES(val1,val2...)」 ;

    INSERT INTO Table2(Field1,Filed2...)...

                  VALUES(val1,val2...)」'

    2008年5月1日 上午 07:47

所有回覆

  • 你要去抓出錯誤是哪個,有時不是因為 SqlException 而是其他錯誤,另外,A table 和 B table 本身是否已有 PK 限制,以及你是否需要加入其他的判斷來確認你的規則是正確的。

     

    我在 SQL Server 2005 上使用這種類型的寫法,沒有發生過你所說的問題。
    2008年4月30日 上午 07:22
    版主
  • 你Insert 2個Table 直接寫在同一個交易的SQL Command 裡不就好了.

     

    2008年4月30日 上午 09:47
  •  好說 寫信:
    你Insert 2個Table 直接寫在同一個交易的SQL Command 裡不就好了.

     

     

     

    您指的「同一個交易的 SQL Command」意思是說同一個 SQL Command 就能一次 INSERT 二個 Table 嗎?

    可是我上網及上書局找了很久,都只見多資料表查詢(SELECT)的語法,找不到多資料表的新增(INSERT)耶。

     

    我原本就有在想查詢時可以

    SELECT * FROM Table1, Table2...

    那新增時不曉得有沒有像

    INSERT INTO Table1(Field1,Filed2...),

                  Table2(Field1,Filed2...)...

                  VALUES(val1,val2...)

    之類的語法,

    可是似乎沒有這樣的語法耶.....

     

    您說的是這個意思嗎?

     

    .

    2008年5月1日 上午 03:38
  • string strCommand=

    '「INSERT INTO Table1(Field1,Filed2...),

                  VALUES(val1,val2...)」 ;

    INSERT INTO Table2(Field1,Filed2...)...

                  VALUES(val1,val2...)」'

    2008年5月1日 上午 07:47
  • 喔喔~~~~ 我懂了~我懂了~

    謝謝唷~

     

    另,也謝謝小朱大大的提醒,我會留意除了 SqlException 以外的錯誤。謝謝囉~ ^^

     

    2008年5月1日 上午 08:53