如何将日期时间值传递给 SQL 而不会出现转换错误

-1 vb.net sql-server datetimepicker

我正在使用 Visual Basic.NET、SQL Server 2016、Visual Studio 2017 制作 Windows 窗体。

我一直在尝试解决这个问题,并且已经set dateformat mdy在 SQL Server Management Studio 查询中尝试过,但是表上的日期仍然采用这种格式:2022-07-17 00:00:00.000。在运行项目时尝试插入某些内容时,这与此错误有什么关系吗?

每个人都说“日期时间不适用于 yy/mm/dd 或 dd/mm/yy,请使用 mm/dd/yy”。但没有人说你如何在数据库或 Visual Studio 中实际更改/修复它。

当我在其他语言上学习和做事情时,我在使用 MySQL 时从未发现过这个错误,所以这个日期时间的事情真的变得令人绝望。非常感谢任何有关如何实际修复此错误的见解。

代码:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim someid As Integer = TextCode.Text
            Dim descri As String = TextDescription.Text
            Dim somedate As DateTime = DateTimePickerinsert.Text
            Dim value As String = TextValue.Text
            Dim stock As String = TextStock.Text
            Dim warehouse As String = ComboWarehouse.Text
    
            con.Open()
            Dim command As New SqlCommand("Insert into Item values('" & someid & "','" & descri & "','" & somedate & "','" & value & "','" & stock & "','" & warehouse & "')", con)
            command.ExecuteNonQuery()
            con.Close()
            MessageBox.Show("Inserted succesfully")
            LoadDataInGrid()
        End Sub
Run Code Online (Sandbox Code Playgroud)

我明白了

System.Data.SqlClient.SqlException:'将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。
该语句已终止。' 线路错误:command.ExecuteNonQuery()

Cha*_*ace 5

您应该使用正确的参数化,将日期保留为实际DateTime值,而不是字符串,就像数字一样。否则你会遇到 SQL 注入问题,这不仅仅是一个安全问题,而且还关系到正确性

在发送参数值之前SqlDbType,应将其转换为正确的类型,并且参数对象也应使用正确的精度/长度进行声明。

您还应该创建并处置连接对象,而不是保持全局连接打开,这是浪费的。自动连接池将确保有效使用可用连接。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim query As String = "
INSERT INTO Item (someid, descri, somedate, value, stock, warehouse)
VALUES (@id, @description, @date, @value, @stock, @warehouse)
"
    Dim someid As Integer = Integer.Parse(TextCode.Text)
    Dim somedate As DateTime = DateTimePickerinsert.Value
    Dim value As Decimal = Decimal.Parse(TextValue.Text)
    Dim stock As Integer = Integer.Parse(TextStock.Text)
    
    Using con As new SqlConnection("YourConnectionString"),
        command As New SqlCommand(query, con)
        command.Parameters.Add("@id", SqlDbType.Int).Value = someid
        command.Parameters.Add("@description", SqlDbType.VarChar, 100).Value = If(TextDescription.Text, DBNull.Value)
        command.Parameters.Add("@date", SqlDbType.DateTime).Value = somedate
        command.Parameters.Add("@value", SqlDbType.Decimal).Value = value
        command.Parameters.Add("@stock", SqlDbType.Int).Value = stock
        command.Parameters.Add("@warehouse", SqlDbType.VarChar, 50).Value = If(ComboWarehouse.Text, DBNull.Value)
        con.Open()
        command.ExecuteNonQuery()
    End Using
    MessageBox.Show("Inserted succesfully")
    LoadDataInGrid()
End Sub
Run Code Online (Sandbox Code Playgroud)

至于在 SSMS 中查看结果:datetime值没有固有的格式。SSMS 将有默认的显示它们的方式,但是您可以通过使用 转换它们来以任何您喜欢的方式显示它们CONVERT,或者在 VB 中使用ToString

  • *“我只想确定日期”*。这是错误的做法。您应该始终使用参数。这个答案演示了如何做到这一点。从示例中学习,理解原理,然后将其应用于所有值。如果你做事半途而废,那么你稍后会回来问同样的问题,这里已经回答了。只要做得正确,效果就会很好。如果您尝试实施此操作并遇到问题,请更新您的问题并向我们展示您尝试过的操作,然后我们可以帮助您解决您做错的事情。 (2认同)