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注入:同样,这里不严格涉及,但接受任何东西 由用户键入并将其直接用作查询的一部分是 这确实是一个很大的错误,可能会让你的客户付出很多代价。见 上面的链接
只有一种方法可以解决这个问题

在您的代码中,您要求编译器将日期时间变量转换为字符串,它执行请求的任务,但它不知道该字符串将执行sql命令。当然,您可以使用ToString和一种格式给它一个强烈的提示,但接下来您就要赌数据库本身能够根据其转换规则将该字符串转换回datatime。最后,为什么要允许所有这些转换?参数可以使您的代码从混乱中解脱出来

现在请注意,命令文本如何变得更清晰,正确传递值的工作是由ADO.NET引擎本身(及其SqlClient类)完成的,它更了解如何为数据库准备DateTime变量


我还应该解决另一个从代码中清晰可见的问题。有一个全局连接对象,可以在需要时重用它。这是一种糟糕的做法,因为您永远无法确定此对象的正确状态。如果在这段代码之前的某个地方,您发现了一个异常,结果是您的连接仍然打开,该怎么办?你再次打开它,你会得到一个新的异常。同样,您的程序将很快突然结束。此外,这些对象包含非托管资源,如果不释放这些资源,将在程序中的任何地方造成问题。我建议您在每次需要时创建一个新的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