【问题标题】:Parsing Date from VB.NET for SQL INSERT从 VB.NET 为 SQL INSERT 解析日期
【发布时间】:2012-02-01 14:05:20
【问题描述】:

我有一个带有表单的 Web 应用程序,我试图将其传递到 ASP.NET 服务器(使用 VB.NET),然后传递到 MS SQL Server 表。该表单在几个文本框中使用 jQuery 日期选择器并将它们格式化为MM/dd/yyyy。然后表单字段通过 PageMethod 传递到 Web 服务器,该服务器获取各种字段值并将它们组合成 SQL UPDATE 命令。

每当我尝试执行 SQL 命令时,我都会不断收到以下错误:

Conversion failed when converting date and/or time from character string.

这是服务器上的代码:

Using myConn As New System.Data.SqlClient.SqlConnection(CString.ConnectionString)
    myConn.Open()

    Dim cmd As New System.Data.SqlClient.SqlCommand("UPDATE table " & _
                             "SET type = '" & type & "', " & _ 
                                 "target = '" & "@target" & "', " & _
                                 "patient = '" & patient & "', " & _
                                 "dob = '" & "@dob" & "' " & _   
                             "WHERE serial = '" & serial & "'", myConn)


    cmd.Parameters.Add(SqlParameter("@target", Data.SqlDbType.Date))       
    cmd.Parameters.Add(SqlParameter("@dob", Data.SqlDbType.Date))

    If target = "" Then
        cmd.Parameters("@target").Value = Data.SqlTypes.SqlDateTime.Null
    Else
        cmd.Parameters("@target").Value = target
    End If

    If dob = "" Then
        cmd.Parameters("@dob").Value = Data.SqlTypes.SqlDateTime.Null
    Else
        cmd.Parameters("@dob").Value = dob
    End If

    cmd.ExecuteNonQuery()

End Using

注意:我已经尝试了大约 20 种不同的方法来解析日期、将它们转换为日期、更改格式,但都没有奏效。

注意2:最后的条件语句只是为了防止空日期字段作为“1/1/1900”存储在SQL DB中,而是作为实际的SQL NULL值。不过,从调试来看,这似乎不是问题 - 是当有一个实际值时才会触发错误。

如果有人能看到我做错了什么以及如何解决它,将不胜感激。提前感谢您的帮助!

【问题讨论】:

    标签: asp.net sql vb.net webforms


    【解决方案1】:

    您正在混淆参数化和非参数化部分(为什么不将所有内容都参数化?)

    Dim cmd As New System.Data.SqlClient.SqlCommand("UPDATE table " & _
                             "SET type = '" & type & "', " & _ 
                                 "target = @target, " & _
                                 "patient = '" & patient & "', " & _
                                 "dob = @dob " & _   
                             "WHERE serial = '" & serial & "'", myConn)
    

    【讨论】:

    • 我不确定这是否有所作为。但你刚刚解决了我的问题。我仍然在参数周围加上单引号(它们最初是非参数,只是存储的字符串变量)。我只是改变了它,它就像一个魅力。我想我也会参数化一切。感谢您的帮助!
    • @mbeasley 您可以混合使用它们,但 target = '@target' 将 target 设置为等于包含“@target”的文字字符串,因为 SQL 将其视为文字。 @ 参数不是刚刚被替换的插入点。
    • 对。这就是我最终解决的问题,并且效果很好。我犯了愚蠢的错误,但吸取了教训。感谢您的帮助。
    【解决方案2】:

    你包括时间吗? DateTime 字段需要日期和时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      相关资源
      最近更新 更多