【问题标题】:Update SQL, no errors, no update更新SQL,没有错误,没有更新
【发布时间】:2016-11-08 14:10:27
【问题描述】:

我正在尝试根据填写到表单中的数据更新表格。
变量是从这样的表单中提取的:

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

【问题讨论】:

  • 您是否对数据库进行了概要分析,以查看该语句正在访问您期望它访问的数据库,如果是这样,该脚本看起来应该是这样吗?此外,您是否尝试过直接在 SSMS 中运行分析查询以确认查询实际上更新了一行?
  • 认为 使用 OleDb,参数是按照它们在命令中的位置顺序设置的。尝试将它们以相同的顺序放置,以便将 ID 放在您的 updateCmd.Parameters.AddWithValue 列表的末尾。
  • 是的,是的。首先,我确保所有参数都正确,将参数名称与变量匹配。然后确保查询详细信息正确,表和数据库。在代码之外运行查询,它确实更新了指定的行,但是在代码中完成时它不会更新。
  • Dim rows = updateCmd.ExecuteNonQuery() 如果 rows 不为零,则查询会执行并更新。如果您仍然看不到这些行,问题可能是:Why saving changes to a database fails? 您还应该使用Add 而不是AddWithValue,这让提供者猜测您想要什么。是的,在 OleDB 中参数是位置的,它根本不使用名称
  • updateCmd.Parameters.AddWithValue("@ID", Me.labelID.Text) 失败,因为您的 ID 列可能是 db 上的 integer,但您尝试通过 labelID.Text 将其设置为字符串。请参阅@Plutonix 评论如何使用Add 而不是。

标签: sql .net vb.net oledb


【解决方案1】:

有各种各样的问题:

无更新

显示的代码不足以知道发生了什么(例如可能是空的Catch)。这将告诉您 Provider 是否成功:

Dim rows = updateCmd.ExecuteNonQuery()

如果它不为零,则它确实更新了。如果您看不到更改,并且数据库是项目的一部分,那么您可能正在查看错误的数据库副本。见Why saving changes to a database fails?

数据类型不匹配

永远不要使用AddWithValue(除非你的名字是 Gordon Linoff 或 Gord Thompson……或者可能是 Steve)。这会导致提供者根据数据假定数据类型:

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, 
                   "")

“新”If 运算符被短路,因此只执行真假部分:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-28
    • 2014-09-22
    • 1970-01-01
    • 2013-03-06
    • 2014-07-22
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多