通过vb.net将日期插入SQL Server数据库

时间:2016-04-19 08:04:46

标签: sql sql-server vb.net

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中却没有。

我不知道为什么它不起作用。

我可以提出修复建议。

4 个答案:

答案 0 :(得分:1)

使用单引号作为日期值",'" & DateTimePicker1.Value.Date & "')"

或者

 ",#" & DateTimePicker1.Value.Date & "#)"

答案 1 :(得分: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并不表示其中会有一定数量。
  • 应在运行查询之前验证这些值,例如:可以将金额文本转换为十进制,这是一个合理的值。

答案 2 :(得分:0)

问题在于给定日期的格式。您可以通过使用.ToString()格式化dateTime输入来解决此问题。即。,

DateTimePicker1.Value.Date.ToString("yyyy-MM-dd HH:mm:ss")

然后出现injection的真正问题;为避免您必须使用parameterised queries代替仅文本查询。

答案 3 :(得分:0)

使用这个 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)