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



我正在做一个windows窗体使用Visual Basic。. NET, SQL Server 2016, Visual Studio 2017.

我一直在试图解决这个问题,并已经尝试了set dateformat mdy在SQL Server管理工作室查询,但我的表上的日期仍然是这种格式:2022-07-17 00:00:00.000。在运行项目时尝试插入某些内容时,这是否与此错误有关?

每个人都说"日期时间不适合yy/mm/dd或dd/mm/yy"之类的话,用mm/dd/yy代替。但是没有人说你实际上是如何在数据库或Visual Studio中修改/修复它的。

当我在其他语言上学习和做事情时,我从来没有在使用MySQL时发现这个错误,所以这个datetime的事情真的很绝望。对于如何实际修复此错误的任何见解都非常感谢。

代码:

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

System.Data.SqlClient。将varchar数据类型转换为日期时间数据类型导致值超出范围。
语句已被终止。command.ExecuteNonQuery()

您应该使用适当的参数化,将日期保存为实际的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

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

你真的很有趣SQL注入使用该代码。你不能直接从Windows控件中插入数据到SQL数据库。

使用SQL连接参数来存放这些值。这样,传入数据中的任何文本都不会被计算为SQL脚本,而是被计算为文本literal.

黑客可以分配SQL脚本到你的TextDescription。文本如"执行'从XXX删除'">它将被执行

Dim descri As String = TextDescription.Text

使用SQL连接参数来存放这些值

使用字符串作为日期可能会遇到很多问题。如果您正在连接到存储过程,或者只是通过SqlClient或ODBC执行SQL,那么修复此错误的一种方法是在SQL字符串中使用Cast将日期字符串转换为服务器可以理解的内容。例:

Insert Into MyTable (MyID, MyDate) Values (@MyID, Cast(@MyDate as datetime));

Insert Into MyTable (MyID, MyDate) Values (123, Cast('2022-03-14 14:12:00' as datetime));

对于您可能使用的不同格式,它将更加宽容。

相关内容

  • 没有找到相关文章

最新更新