1. 程式人生 > >SQL語句的兩次執行問題

SQL語句的兩次執行問題

     昨天下午,寫充值視窗時,出現了SQL語句被執行兩次的問題。頭痛了一下午和一晚上。大哭

    充值的視窗要操作兩張表,一張是學生的基本資訊表,就是將充值金額寫入。另一張表,是用來存放本次充值的資訊,比如:充值時間日期,誰充的錢。。。對前一張表的操作很快就寫好了。但是在修改第二張表時,卻出現了問題。

     先來看一下程式碼:

'修改教師充值表
        SQL3 = "insert into tearechargeinfo values('" & strCardNum & "','" & strUserName & "','" & ChargeDate & "','" & ChargeTime & "','" & RechargeRMB & "','" & "未結賬" & "')"
        
        Call ExecuteSQL(SQL3, strMsg)
  

修改這個表就兩條語句。但是執行後,每次都是這樣的:

每次充值,都會出現兩條一樣的記錄。額,,以前都是SQL語句寫的不對,記錄插入不到資料庫裡,但是這次怎麼還買一贈一了啊?

我到底哪裡錯了??????這是我這一年來一直在問自己的問題。

查吧,不是資料庫有問題,就是執行SQL語句時被重複執行了。

首先,是SQL SERVER資料庫的檢查:


     手動插入,一條SQL語句插入的就是一條記錄,看來資料庫裡沒有連續觸發這種事。。。。。。。

     再查程式碼,也寫的很對啊。。。如果SQL語句寫的不對,那麼肯定是一條都插入不進去的。所以,可能是程式碼在執行時,遇到了一個可以讓程式碼重複執行的邏輯問題。

     以前也用過SQL語句插入資料,那時都是執行給一個SQL語句,插入一條啊。這次,,這是幾個意思啊。????

      昨天晚上回去之後,仔細想了想。。終於想到可能是那個環節出了問題:

因為這個表沒有定義主鍵,所以可以重複插入兩條相同的記錄。而以前我寫的那些可以成功執行INSERT操作的表都是有主鍵的,主鍵會自帶一個唯一性約束,所以,即使程式碼即使被重複執行了兩次,它在第一次時成功插入了,第二次時再想插入一條相同記錄時,卻因為存在主鍵,被資料庫拒絕插入。導致了我只看到了一旦執行插入,就會插入一條記錄的結果。而這個表因為沒有主鍵,就被插入了一條又一條。

為了驗證猜測,在資料庫裡玩兒了個小實驗:

在這個TeaRechargeInfo(無主鍵)裡面,寫了:

這個SQL語句會插入兩條相同記錄,下圖為執行後的結果

說明在沒有主鍵時,同時插入兩條相同記錄無壓力。這個結論或許你早就知道,但是,下面這個你就可能沒有試過了:

然後在一個有主鍵的表裡面,試圖同時插入兩條記錄


結果是,在插入第二次時,資料庫因為檢查到違反了主鍵約束,會自動終止這種操作。

後來,經檢查,原來果然是模組裡在執行SQL語句時執行了兩次。

下面是原來的出錯的程式碼段

	cmd.Execute    '執行SQL語句
    '將查詢的結果儲存在recordset物件中
    Set Rst = New ADODB.Recordset
    Rst.CursorType = adOpenKeyset   '設定遊標型別
    Rst.LockType = adLockOptimistic '設定鎖定型別
      
    Set Rst = cmd.Execute()     '將查詢的結果儲存在recordset物件中
    Set ExecuteSQL = Rst        '返回函式的結果

上面的:cmd.Execute 和SetRst = cmd.Execute()這兩句話,有同一個效果,剛開始寫的時候,只是想讓command物件執行SQL操作,然後將結果通過SetRst = cmd.Execute()這句話賦值給Recordset物件,沒有考慮到,在賦值的過程中,SQL語句又被默默的執行了一遍。。。。。

找到了問題的癥結,接下來,只要一針就能見血了。。。。

改後:

cmd.CommandText = Trim(SQL)    '設定SQL語句     '將查詢的結果儲存在recordset物件中
    Set Rst = New ADODB.Recordset
    Rst.CursorType = adOpenKeyset   '設定遊標型別
    Rst.LockType = adLockOptimistic '設定鎖定型別
    Set Rst = cmd.Execute '執行SQL語句
    Set ExecuteSQL = Rst        '返回函式的結果

今晚,終於可以在繁星漫天下安然入眠了(借用《達芬奇密碼》結尾,因為解決一個問題後,大概就是這種感覺了。。。。