更新SQL,没有错误,没有更新

时间:2016-11-08 14:10:27

标签: sql .net vb.net oledb

我正在尝试从填写到表单中的数据更新表格 变量从表格中拉出:

_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)

1 个答案:

答案 0 :(得分:3)

存在各种问题:

无更新

没有足够的代码来显示正在发生的事情(比如可能是空的Catch)。这将告诉您提供者是否成功:

Dim rows = updateCmd.ExecuteNonQuery()

如果不为零,则 更新。如果您无法看到更改,并且数据库是项目的一部分,您可能会查看错误的数据库副本。见Why saving changes to a database fails?

数据类型不匹配

永远不要使用AddWithValue(除非你的名字是Gordon Linoff或Gord Thompson ......或者也许是史蒂夫)。这会导致提供程序根据数据采用数据类型:

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

如果ID列是整数,则表示您传递了一个字符串 - 数据不匹配。其他数据库可能会出现非常非常错误;使用Add

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

我确保所有参数都正确,将参数名称与变量相匹配。

接下来, 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应该是最后一个,因为它出现在SQL

的最后

请勿使用IIF

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

" new" If运算符被短路,因此只执行true或false部分:

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