2016-11-08 83 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, 
         "")