来自DateTimePicker的SQL字符串中的日期

时间:2014-08-13 07:41:51

标签: sql vb.net

我试图将VB.Net中Windows窗体中的DateTimePicker中的日期插入到SQL字符串中,以便将其识别为日期时间(字段本身在SQL Server中设置为日期时间)。 / p>

我尝试过几种方法(SQL级别为Convert,VB.Net级别为Format),现在使用存储为DateTime的变量,但是我仍然无法得到它上班。我的代码片段如下:

Using sqlConn = New SqlConnection(My.Settings.sqlString)
        sqlConn.Open()
        Dim dte As DateTime = Convert.ToDateTime(Me.dateMain.Text)
        Dim cmd As SqlCommand
        cmd = sqlConn.CreateCommand
        cmd.CommandText = "Update Table1 " &
        "SET Person='" & Me.person.Text & "'," &
        "Date='" & dte & "' " &
        "WHERE (Code = '" & PCode & "')"
        cmd.ExecuteNonQuery()
        cmd = Nothing
End Using

编辑: 以下错误(或轻微变化)是我几乎所有尝试过的尝试。在下面提交参数化答案后收到此错误

  

未处理的类型' System.Data.SqlClient.SqlException'发生在System.Data.dll

中      

其他信息:将char数据类型转换为日期时间数据类型会导致日期时间值超出范围。

所以看起来即便如此,它还没有将它识别为SQL中的日期时间。我想我需要在SQL字符串中再次使用Convert,但我对函数的了解是有限的。任何人都知道如何使用它来实现这一点(如果这是解决方案)?

2 个答案:

答案 0 :(得分:5)

听起来像是参数化的工作!

Using sqlConn = New SqlConnection(My.Settings.sqlString)
    sqlConn.Open()
    Dim cmd As SqlCommand
    cmd = sqlConn.CreateCommand
    cmd.CommandText = "Update Table1 " &
        "SET Person = @person, " &
        "Date = @dte " &
        "WHERE (Code = @code)"
    cmd.Parameters.AddWithValue("@person", Me.person.Text)
    cmd.Parameters.AddWithValue("@dte", Me.dateMain.Value)
    cmd.Parameters.AddWithValue("@code", PCode)
    cmd.ExecuteNonQuery()
    cmd = Nothing
End Using

当你在这里时,我不想改变太多,因为我从来没有在我的生活中写过一行VB(所以这也可能是也可能不对,如果它没有,请告诉我“编译或其他东西,但这是要点”,但SqlCommand确实实现了IDisposable,所以你应该把它包装在Using中。

参数化您的查询将消除您遇到的错误,促进代码重用,并且可以说最重要的是,停止SQL注入攻击。对于我们所有的事情,请始终使用参数。

答案 1 :(得分:0)

您可以使用ISO 8601格式(YYYY-MM-DDThh:mm:ss[.mmm]YYYYMMDD hh:mm:ss[.mmm])或使用未分隔格式(YYYYMMDD hh:mm:ss[.mmm])。两者都应该正常工作。

虽然参数化查询仍然更好。