通过 vb.net 将日期插入 SQL Server 数据库
Posted
技术标签:
【中文标题】通过 vb.net 将日期插入 SQL Server 数据库【英文标题】:Insert date into SQL Server database through vb.net 【发布时间】:2016-04-19 08:04:46 【问题描述】:Dim SALESINSERT As New SqlCommand("INSERT INTO Tbl_Sales (Sale_id, Transaction_No, Customer_id, Item_id, Amount, Date) VALUES(" _
& SalesIdMax + 1 & "," & Transaction_label.Text & "," & 1 & "," & Label4.Text & "," & TextBox1.Text & _
"," & DateTimePicker1.Value.Date & ")", sqlcon)
sqlcon.Open()
SALESINSERT.ExecuteNonQuery()
sqlcon.Close()
SALESINSERT = Nothing
我有这个代码。一切正常,但问题在于日期。由于某种原因,它每次都会插入相同的日期:“1/1/1900”。
当我调试代码以查看 SQL 命令文本时,它很好,日期也很好,我在 SQL 查询中执行它,它非常好。
但在 VB 中却没有。
我不知道为什么它不起作用。
请给我一些修复它的建议。
【问题讨论】:
使用参数化查询 - 这将防止 sql 注入并将此问题作为副作用修复。请注意,如果您的代码使用不同的语言环境运行,您的代码将会失败 首先,我强烈推荐你使用Option Strict On。然后,对查询中的值使用 SQL 参数。 "一切正常?"这令人困惑,因为该代码不可能工作 【参考方案1】:如果您总是使用参数化查询,那么您将避免将日期表示为字符串的问题。
您可以像这样使用 SQL 参数(我不得不猜测数据库列的数据类型)进行查询:
Dim salesinsert As New SqlCommand("INSERT INTO Tbl_Sales ([Sale_id], [Transaction_No], [Customer_id], [Item_id], [Amount], [Date])" &
" VALUES(@SaleId, @TransactionNo, @CustomerId, @ItemId, @Amount, @Date)", sqlcon)
salesinsert.Parameters.Add(New SqlParameter With .ParameterName = "@SaleId", .SqlDbType = SqlDbType.Int, .Value = SalesIdMax + 1)
salesinsert.Parameters.Add(New SqlParameter With .ParameterName = "@TransactionNo", .SqlDbType = SqlDbType.NVarChar, .Size = 20, .Value = Transaction_label.Text)
salesinsert.Parameters.Add(New SqlParameter With .ParameterName = "@CustomerId", .SqlDbType = SqlDbType.Int, .Value = 1)
salesinsert.Parameters.Add(New SqlParameter With .ParameterName = "@ItemId", .SqlDbType = SqlDbType.NVarChar, .Size = 20, .Value = Label4.Text)
salesinsert.Parameters.Add(New SqlParameter With .ParameterName = "@Amount", .SqlDbType = SqlDbType.Decimal, .Value = CDec(TextBox1.Text))
salesinsert.Parameters.Add(New SqlParameter With .ParameterName = "@Date", .SqlDbType = SqlDbType.DateTime, .Value = DateTimePicker1.Value)
sqlcon.Open()
salesinsert.ExecuteNonQuery()
sqlcon.Close()
salesinsert.Dispose()
我用方括号对列名进行了转义——这避免了使用SQL reserved keywords 作为列名的问题。总是对列名进行转义会更容易。
您不应设置SALESINSERT = Nothing
- 而是使用salesinsert.Dispose()
,因为这会正确清理非托管资源。
您需要更改每个.SqlDbType
(和.Size
用于字符串)以匹配数据库列的数据类型。十进制值应该也定义了.Scale
和.Precision
。
控件可以使用描述性名称 - TextBox1
并未暗示其中包含金额。
应该在运行查询之前验证值,例如金额文本可以转换为十进制吗?它是一个合理的值吗?
【讨论】:
好吧,但我想知道你添加参数的方式,因为我只是用这种方式 'SALESINSERT.Parameters.Add("@trans", SqlDbType.BigInt).Value = Transaction_label .Text',但它不起作用,这是为什么? 好吧,可以,但我想知道你添加参数的方式,因为我只是用这种方式SALESINSERT.Parameters.Add("@trans", SqlDbType.BigInt).Value = Transaction_label.Text
,但它不起作用,为什么会这样?
@Abram 1) 我喜欢使用.Add(New SqlParameter With ....
,因为它让参数的含义一目了然而且它可以工作。 2)你有一个数据类型不匹配错误。您不能将字符串分配给数字 - 如果您使用 Option Strict On 那么编译器会为您指出这一点。【参考方案2】:
对日期值使用单引号",'" & DateTimePicker1.Value.Date & "')"
或者
",#" & DateTimePicker1.Value.Date & "#)"
【讨论】:
【参考方案3】:问题在于给定日期的格式。您可以通过使用 .ToString()
格式化 dateTime 输入来避免此问题。即,
DateTimePicker1.Value.Date.ToString("yyyy-MM-dd HH:mm:ss")
接下来是injection的真正问题;为避免您必须使用 parameterised queries 代替纯文本查询。
【讨论】:
【参考方案4】:使用这个 Dim SALESINSERT As New SqlCommand("INSERT INTO Tbl_Sales (Sale_id, Transaction_No, Customer_id, Item_id, Amount, Date) VALUES(" _ & SalesIdMax + 1 & "," & Transaction_label.Text & "," & 1 & "," & Label4.Text & "," & TextBox1.Text & _ ",CONVERT(DateTime,'09/07/2021',103))", sqlcon)
【讨论】:
这不是将值连接到 sql 查询中的好习惯。某些字符可能会导致问题,值可能不会以正确的格式/作为正确的对象类型传递。以上是关于通过 vb.net 将日期插入 SQL Server 数据库的主要内容,如果未能解决你的问题,请参考以下文章
VB.NET 将 DataGridVIew 内容插入 SQL Server 表
是否可以一次将整个 VB.NET 数据表插入 SQL Server
如何使用 vb.net 将 excel 文件导入 sql server