我试图将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
,但我对函数的了解是有限的。任何人都知道如何使用它来实现这一点(如果这是解决方案)?
答案 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]
)。两者都应该正常工作。
虽然参数化查询仍然更好。