我正在尝试将ASP.net webforms中的数据插入SQL Server但我收到错误
将varchar数据类型转换为日期时间数据类型会导致超出范围的值。
我不明白这个错误,请帮我查一下这是什么错误。
Protected Sub Myinsert_Click(sender As Object, e As EventArgs) Handles Myinsert.Click
Dim dt As New Date
dt = DateAndTime.Now.ToString
p = "Image/" + ImgPath.FileName.ToString
Try
cn.Open()
cmd.Connection = cn
cmd.CommandText = "INSERT INTO MyWebSite( img, type, title, short_para, full_para, datepost) VALUES('" & p & "','" & txtType.Text & "','" & txtTitle.Text & "','" & ParaTT.Text & "','" & Para.Text & "','" & dt & "')"
cmd.ExecuteNonQuery()
cn.Close()
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
答案 0 :(得分:1)
如果使用字符串连接来构建sql查询,则对sql注入是开放的。而是始终使用sql-parameters。这也解决了其他问题(例如日期转换)。
此外,请勿声明Dim dt As New Date
并使用字符串对其进行初始化。我强烈建议您将Option Strict
设置为On
。这不会解决任何问题,也会导致许多编译器错误。但通过修复它们,您将学习很多关于.NET类型系统的知识,并且您将学习编写更安全的代码,这些代码不依赖于隐式转换(或者易受不良转换的影响)。
Protected Sub Myinsert_Click(sender As Object, e As EventArgs) Handles Myinsert.Click
Try
Using cn = New SqlConnection("Connection String")
Dim insertSQL = "INSERT INTO MyWebSite(img, type, title, short_para, full_para, datepost) VALUES(@img, @type, @title, @short_para, @full_para, @datepost)"
Using cmd = New SqlCommand(insertSQL, cn)
cmd.Parameters.Add(New SqlParameter("@img", SqlDbType.VarChar))
cmd.Parameters(cmd.Parameters.Count - 1).Value = "Image/" + ImgPath.FileName.ToString()
cmd.Parameters.Add(New SqlParameter("@type", SqlDbType.VarChar))
cmd.Parameters(cmd.Parameters.Count - 1).Value = "your type"
' ....... other parameters .....
cmd.Parameters.Add(New SqlParameter("@datepost", SqlDbType.DateTime))
cmd.Parameters(cmd.Parameters.Count - 1).Value = Date.Now
cn.Open()
Dim inserted As Int32 = cmd.ExecuteNonQuery()
End Using ' no need to close the connection due to the using
End Using
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
请注意,我已使用Using
语句确保处置所有非托管资源,即使发生错误也会关闭连接。