2016-11-08 44 views
1

我正在嘗試從填充到表單中的數據更新表。
這些變量從表單拉這樣的:更新SQL,沒有錯誤,沒有更新

_JEBatchDate = IIf(Me.textJEBatchDate.Text.Trim.Length > 0, Me.textJEBatchDate.Text.Trim, "") 

更新SQL看起來像這樣...

UPDATE [MAIN] SET [CheckNumber] = @checknumber, [CheckDate] = @checkdate, [CheckCashDate] = @checkcashdate, [CheckAmount] = @checkamount, [PayeeNumber] = @payeenumber, [AccountNumber] = @accountnumber, [Bank] = @bank, [ToTheOrderOf] = @totheorderof, [CheckType] = @checktype, [DatePaperworkSentToPayee] = @datepaperworksenttopayee, [DatePaperworkSentToBank] = @datepaperworksenttobank, [IncompleteReason] = @incompletereason, [RejectReason] = @rejectreason, [CaseNumber] = @casenumber, [BankStatus] = @bankstatus, [CorrWithPayee] = @corrwithpayee, [Comments] = @comments, [BankCredit] = @bankcredit, [Refund] = @refund, [DateFundsRecdFromBank] = @datefundsrecdfrombank, [DateRefundRecd] = @daterefunded, [DateTargetSent] = @datetargetsent, [NumberOfTargets] = @numberoftargets, [DateCreditPostedToCLI] = @datecreditpostedtocli, [DateSentToSGForRepayment] = @datesenttosgforrepayment, [DateClaimWasRepaid] = @dateclaimwasrepaid, [NewCheckNumber] = @newchecknumber, [NewCheckAmount] = @newcheckamount, [ARCHIVED] = @archived, [JEBatchName] = @jebatchname, [JEBatchDate] = @jebatchdate WHERE [ID] = @ID; 

所有值以這種方式構建

strValues = strValues & "[JEBatchDate] = @jebatchdate " 

在一個Try ... catch中,參數按這種方式構造:

Try 
     Using updateCmd As New OleDb.OleDbCommand(UpdateSQL, HMOConnection) 
      updateCmd.Parameters.AddWithValue("@ID", Me.labelID.Text) 
      updateCmd.Parameters.AddWithValue("@checknumber", _checkNumber) 
      updateCmd.Parameters.AddWithValue("@checkdate", _checkDate) 

我使用updateCmd.ExecuteNonQuery()來執行查詢。
該代碼通過Try ... Catch運行而沒有錯誤,但沒有更新記錄。我已經仔細檢查了所有的名字,拼寫,連接,但是仍然沒有更新。任何意見或建議表示讚賞!

編輯
如果我提出從頂部到底部,我得到一個數據類型不匹配錯誤這一行:

updateCmd.Parameters.AddWithValue("@ID", Me.labelID.Text) 
+0

你如何驗證更新不起作用?你使用了| DataDirectory |嗎?連接字符串中的快捷方式? – Steve

+0

我可以直接進入數據庫並檢查。 – user3795810

+1

您是否已經對數據庫進行了剖析,以查看該語句是否觸及您期望的數據庫,如果有,該腳本看起來應該如何?此外,您是否嘗試過直接在SSMS中運行配置文件查詢以確認該查詢實際上更新了一行? – Kritner

回答

3

有各種問題:

沒有更新

沒有足夠的代碼顯示知道正在發生什麼(l ike也許是空的Catch)。這會告訴你,如果供應商成功:

Dim rows = updateCmd.ExecuteNonQuery() 

如果不爲0,它更新。如果您看不到更改,並且數據庫是項目的一部分,那麼您可能會查看錯誤的數據庫副本。見Why saving changes to a database fails?

數據類型不匹配

不要使用AddWithValue永遠(除非你的名字是戈登·利諾夫或戈德湯普森...也許史蒂夫)。這將導致供應商承擔基於數據的數據類型:

updateCmd.Parameters.AddWithValue("@ID", Me.labelID.Text) 

如果ID列是整數,要傳遞一個字符串 - 這數據不匹配。事情可能會非常非常錯誤與其他數據庫;使用Add

updateCmd.Parameters.Add("@ID", OleDbType.Integer).Value = Convert.ToInt32(labelID.Text) 

I made sure all of the parameters were correct, matching the parameter name with the variable.

接下來,OLEDB不使用命名的參數,例如 - 你必須在正確的順序,它們出現在SQL提供每個。您的SQL:

UPDATE [MAIN] SET [CheckNumber] = @checknumber, 
     [CheckDate] = @checkdate, 
     [CheckCashDate] = @checkcashdate,... 

但你不按照這個順序提供參數:

updateCmd.Parameters.AddWithValue("@ID", Me.labelID.Text) 
updateCmd.Parameters.AddWithValue("@checknumber", _checkNumber) 
updateCmd.Parameters.AddWithValue("@checkdate", _checkDate) 

@ID應該是最後一次,因爲它

不要使用IIF最後出現在SQL

_JEBatchDate = IIf(textJEBatchDate.Text.Trim.Length > 0, 
        textJEBatchDate.Text.Trim, 
        "") 

「新」 If運營商短路,這樣只執行真或假的部分:

_JEBatchDate = If(textJEBatchDate.Text.Trim.Length > 0, 
         textJEBatchDate.Text.Trim, 
         "")