0

我在 Access 2007 中有一个非常简单的数据库,我正在使用 VB 2010 连接它。有两个表,MenuItems 和 Orders,Orders.orderDate 的类型为“Date”。

我正在我的一种 VB 表单中运行以下代码(连接字符串和其他一切都很好):

  sql = "SELECT OrderDate, MenuItem FROM MenuItems, Orders WHERE Orders.itemID = MenuItem.ID AND Orders.orderDate BETWEEN '" + fromDate + "' AND '" + toDate + "'"
  Dim cmd As New OleDb.OleDbCommand(sql, con)
  Dim count As Integer = cmd.ExecuteNonQuery()

但我收到一个错误:

System.Data.OleDb.OleDbException (0x80040E10): value wan't given for one or more of the required parameters

似乎什么都没有。我对另一个查询使用了相同的代码,除了 sql 不同。但我认为我的 sql 足够简单。这是在一个实例中生成的 sql(我已经仔细检查过,所有表名和列名都是正确的):

SELECT OrderDate, MenuItem From MenuItems, Orders WHERE Orders.itemID = MenuItem.ID AND Orders.orderDate BETWEEN '11/21/2012' AND '11/24/2012'
4

3 回答 3

1

好吧,ExecuteNonQuery 方法用于更改数据的语句,即。DELETE / UPDATE /INSERT,返回值是受该语句影响的行数。由于您使用的是 Select 语句,因此您应该使用 oledbDataAdapter 和 Fil DataSet 来使用。

Dim conn As New OleDbConnection(con)
Dim adapter As New OleDbDataAdapter()
sql = "SELECT OrderDate, MenuItem FROM MenuItems, Orders WHERE Orders.itemID = MenuItem.ID AND Orders.orderDate BETWEEN '" + fromDate + "' AND '" + toDate + "'"
adapter.SelectCommand = new OleDbCommand(sql, con)
adapter.Fill(dataset)
Return dataset
于 2012-11-23T21:01:53.690 回答
1

问题是一个拼写错误的表格。(MenuItem而不是MenuItems),但它没有解决问题,我仍然得到一个错误。事实证明,数据库与用作查询参数的日期选择器值之间的匹配格式存在问题。

所以我确保我以简短的日期格式保存到数据库中:

sql = "INSERT INTO Orders(itemID, OrderDate) VALUES('" + ListBox1.SelectedValue.ToString() + "','" + FormatDateTime(OrderDate.Value, DateFormat.ShortDate) + "')"
于 2012-11-24T17:07:29.480 回答
1

您应该使用参数化查询至少有两个原因。

  1. 您不必担心日期(和其他)文字和语言环境问题。

  2. 您不必担心 SQL 注入攻击,即有人在文本框中输入恶意代码,从而将 SQL 语句变为有害语句。

将您的声明更改为

sql = "SELECT Orders.OrderDate, MenuItems.MenuItem " & _
    "FROM MenuItems INNER JOIN Orders ON MenuItems.ID = Orders.itemID " & _
    "WHERE Orders.orderDate BETWEEN ? AND ?"

然后像这样执行命令

Dim fromDate, toDate As DateTime

fromDate = DateTime.Parse(fromDateTextBox.Text)
toDate = DateTime.Parse(toDateTextBox.Text)

Dim dataset As New DataSet()
Using conn As New OleDbConnection(connectionString)
    Using adapter As New OleDbDataAdapter()
        Dim cmd As New OleDbCommand(sql, conn)
        cmd.Parameters.Add("?", fromDate)
        cmd.Parameters.Add("?", toDate)
        adapter.SelectCommand =  cmd
        adapter.Fill(dataset)
    End Using
End Using
于 2012-11-24T17:39:11.090 回答