我使用以下命令为变量设置日期值:
Dim someDate As DateTime = Date.Today.AddDays(1)
nextMonday = someDate
While nextMonday.DayOfWeek <> DayOfWeek.Monday
nextMonday = nextMonday.AddDays(1)
End While
然后我使用以下内容将日期插入SQL Server表:
Private Sub CButton1_ClickButtonArea(Sender As Object, e As MouseEventArgs) Handles CButton1.ClickButtonArea
Dim doenditstring As String = "INSERT INTO Parsversoeke (ma_datum,di_datum) " & _
"VALUES (" & _
"'" & nextMonday & "'," & _
"'" & nextTuesday & "')"
cnn.Open()
Dim aksie As New SqlClient.SqlCommand(doenditstring, cnn)
aksie.ExecuteNonQuery()
cnn.Close()
它有效,但我只能在两个日期之前完成。之后我收到以下错误:
从字符串
转换日期和/或时间时转换失败
有没有人知道我为什么会收到错误?
答案 0 :(得分:6)
不,这种连接字符串的方法从一开始就注定要失败 您会收到语法错误,转换错误以及可能Sql Injection Attacks。
只有一种方法可以解决这个问题。 Parameterized queries
Private Sub CButton1_ClickButtonArea(Sender As Object, e As MouseEventArgs) Handles CButton1.ClickButtonArea
Dim doenditstring As String = "INSERT INTO Parsversoeke " & _
"(ma_datum,di_datum) " & _
"VALUES (@m, @t)"
cnn.Open()
Dim aksie As New SqlClient.SqlCommand(doenditstring, cnn)
aksie.Parameters.Add("@m", SqlDbType.Date).Value = nextMonday
aksie.Parameters.Add("@t", SqlDbType.Date).Value = nextTuesday
aksie.ExecuteNonQuery()
cnn.Close()
End Sub
在您的代码中,您要求编译器将DateTime变量转换为字符串并执行请求的任务,但它不知道此字符串将执行sql命令。当然,您可以使用ToString和格式给它一个强烈的提示,但是您打算在数据库本身上根据其转换规则将该字符串转换回数据时间。最后,为什么要允许所有这些转换?参数可以减轻你的代码。
注意,现在,您的命令文本如何更清晰,正确传递值的工作是由ADO.NET引擎本身(及其SqlClient类)完成的,他们更了解如何为数据库准备DateTime变量。
我还应该解决您的代码中清晰可见的另一个问题。有一个全局连接对象可以在需要时重用。这是一种不好的做法,因为您永远不能确定此对象的正确状态。如果在某个地方,在此代码之前,你发现了异常,结果你的连接仍然是开放的?你再次打开它,你会得到一个新的例外。同样,您的程序将很快突然结束。此外,这些对象包含非托管资源,如果没有释放,将导致程序中的每个位置出现问题。我建议每次需要时创建一个新的SqlConnection,并确保在代码末尾将其销毁,并将其包含在Using Statement中