Sql server 将日期保存到SQL Server表
我使用以下方法将日期值设置为变量:Sql server 将日期保存到SQL Server表,sql-server,vb.net,Sql Server,Vb.net,我使用以下方法将日期值设置为变量: Dim someDate As DateTime = Date.Today.AddDays(1) nextMonday = someDate While nextMonday.DayOfWeek <> DayOfWeek.Monday nextMonday = nextMonday.AddDays(1) End While 这很有效,不过我只能做两次。之后,我得到以下错误: 从字符串转换日期和/
Dim someDate As DateTime = Date.Today.AddDays(1)
nextMonday = someDate
While nextMonday.DayOfWeek <> DayOfWeek.Monday
nextMonday = nextMonday.AddDays(1)
End While
这很有效,不过我只能做两次。之后,我得到以下错误:
从字符串转换日期和/或时间时转换失败
有人知道我为什么会出错吗?没有,这种连接字符串的方法从一开始就注定要失败。
您可能会遇到语法错误、转换错误以及其他错误
- 语法错误:严格来说这不是您的情况,但是如果字符串用作 一个值包含一个引号,然后是整个连接字符串 在语法上变得无效
- 转换错误:您不必担心如何将数据准备到 可以接受作为数据库的输入。十进制呢 分离器?你应该用点还是逗号?这取决于地点 数据库的设置,以及数据库是否位于不同的区域性上 代码很快就会变成一团乱麻,充斥着无用的替换或替换 托斯特林
- Sql注入:同样,这里不严格涉及,但接受任何东西 由用户键入并将其直接用作查询的一部分是 这确实是一个很大的错误,可能会让你的客户付出很多代价。见 上面的链接
我还应该解决另一个从代码中清晰可见的问题。有一个全局连接对象,可以在需要时重用它。这是一种糟糕的做法,因为您永远无法确定此对象的正确状态。如果在这段代码之前的某个地方,您发现了一个异常,结果是您的连接仍然打开,该怎么办?你再次打开它,你会得到一个新的异常。同样,您的程序将很快突然结束。此外,这些对象包含非托管资源,如果不释放这些资源,将在程序中的任何地方造成问题。我建议您在每次需要时创建一个新的SqlConnection,并确保在代码结束时将其销毁,并将其包含在Using语句中我对vb.net不太了解(我认识它),但在执行它们之前,您是否可以将它们打印到控制台(或以某种方式记录它们?)。您的日期最好格式化为
YYYY-MM-DD
或yyyyymmdd
(ISO 8601方式)您不应该将SQL语句连接在一起,而应该使用参数化查询来避免SQL注入。作为一个副作用,当试图以字符串文字形式插入日期时,这也解决了那些令人讨厌的格式问题(一个或多个单引号等)。。。。
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()
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