【问题标题】:Need to understanding error message需要理解错误信息
【发布时间】:2016-03-30 16:54:18
【问题描述】:

大家好,在 ASP.NET 中出现错误(VB 中的代码),我不知道这意味着什么。 当我执行下面的代码来更新我的数据库中的表时出现错误

Dim v_command1 As New SqlCommand
Dim v_sqlcode1 As String
v_sqlcode1 = "Update Session SET Endtime = DATEADD(Hour,'" & DRPL_DURATION.SelectedValue & "','" & TXTBX_START.Text & "') WHERE  SessionID = ('" & TXTBOX_SESSIONID.Text & "')"
        v_sqlconn.Open()

当我决定更改会议的持续时间时,此代码应该允许我更新会议的结束时间。 我得到的错误是:

Additional information: Argument data type varchar is invalid for argument 2 of dateadd function.

有谁知道这个错误信息可能意味着什么。

谢谢

【问题讨论】:

  • 使用参数化的sql命令对象,这简直是邪恶的。

标签: sql asp.net vb.net


【解决方案1】:

正如错误所述,您不能将varchar 数据类型用于DATEADD() 的第二个参数。我是looking for an integer

如果您传递的值是该整数,只需删除单引号:

"[...] Hour, " & DRPL_DURATION.SelectedValue & ", [...]"

如果它不是一个整数并且你实际上是在尝试传递一个文本字符串,那么你需要重新考虑你在做什么,因为你不能将文本添加到日期。

注意:我也强烈建议使用参数化查询,而不是像这样直接连接值。这会在您的代码中引入 SQL 注入漏洞,该漏洞可通过查询参数消除。此外,当您简单地将值传递给查询引擎并让引擎决定如何管理数据类型时,您会发现与列数据类型相关的错误要少得多。

【讨论】:

  • 感谢您的及时回复。简单地删除单个 qoutes 就可以了。您能否详细说明您对使用参数化查询的其他评论,因为这是我第一次听说它们...谢谢
  • @D-Boy110:这看起来是一个很好的入门示例:stackoverflow.com/questions/542510/… 这个想法是,当您直接连接值时,您可以让用户有机会更改 值 到 code 中,称为 SQL 注入。但是通过使用参数,您可以明确地告诉 SQL 驱动程序哪些部分是代码,哪些部分是值,然后它会相应地处理它们。
【解决方案2】:

https://msdn.microsoft.com/en-CA/library/ms186819.aspx

Dateadd 正在寻找一个数字作为第二个参数,而您正在向它传递一个字符串(varchar)。

【讨论】:

    【解决方案3】:

    此错误消息与DATEADD(..). 的第二个参数相关联,您需要使用整数(数字)值。

    有关更多信息,请参阅文档DATEDD

    【讨论】:

      猜你喜欢
      • 2018-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      • 1970-01-01
      相关资源
      最近更新 更多