0

Access 2007 には、VB 2010 を使用して接続している非常に単純なデータベースがあります。MenuItems と Orders の 2 つのテーブルがあり、Orders.orderDate は「Date」型です。

VB フォームの 1 つで次のコードを実行しています (接続文字列と他のすべては問題ありません)。

  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は十分に単純だと思います。1 つのインスタンスで生成された 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

少なくとも2つの理由から、パラメーター化されたクエリを使用する必要があります。

  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 に答える
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

問題は、表のつづりの誤りでした。(MenuItems の代わりに MenuItem)、それでも問題は解決しませんでしたが、それでもエラーが発生しました。データベースとクエリ パラメータとして使用されている datepicker 値との間の一致する形式に問題があることが判明しました。

したがって、短い日付形式でデータベースに保存したことを確認しました。

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