通过 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

使用 VB.NET 表单从 SQL Server 到 Excel 的日期数据检索

VB.NET SQL 日期比较

如何从数据表 vb.net 向 sql server 数据库插入值