2012-11-23 58 views
0

我在Access 2007中有一個非常簡單的數據庫,我使用VB 2010連接到它。有兩個表,MenuItems和Orders,Orders.orderDate是鍵入「日期」。參數缺失ExecuteNonQuery命令,在VB.NET和Access中使用

我跑在我的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' 
+2

MS Access中的日期分隔符是#觀看了現場問題的日期執行該命令,以及。 – Fionnuala

+1

你的意思是它應該是SELECT OrderDate,MenuItem從MenuItems,Orders WHERE Orders.itemID = MenuItem.ID AND Orders.orderDate BETWEEN#11/21/2012#和#11/24/2012#?我試過了,沒有區別。 – user961627

+1

此外,選擇不是非查詢,它不返回一個整數。它返回一個記錄集。 – Fionnuala

回答

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 
+0

好的謝謝你的建議 - 我會那樣做的。但在這種情況下,'fromDate'和'toDate'可以直接從表單的日期字段中取出值嗎?還是有必要先格式化它們? – user961627

+1

他們必須是'DateTime'對象。你可以使用'DateTime.Parse'或'DateTime。TryParse「進行轉換,甚至是VB特定的'CDate'功能。請注意,VB爲'System.DateTime'結構提供別名'Date'。 –

+0

還要注意,術語「格式化」僅適用於字符串。將格式不明的日期字符串轉換爲DateTime可生成格式自由日期。 「DateTime」將日期保留爲代表自引用日期以來的天數的「Double」數字。數字的一部分表示時間。 –

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 
+0

我建議將它從nonquery更改爲command,但我得到相同的錯誤。 – user961627

1

該問題是拼寫錯誤的表格。 (MenuItem而不是MenuItems),但它沒有解決問題,我仍然有一個錯誤。事實證明,數據庫和用作查詢參數的日期選擇器值之間的匹配格式是一個問題。

所以我確信我在短日期格式保存到數據庫:

sql = "INSERT INTO Orders(itemID, OrderDate) VALUES('" + ListBox1.SelectedValue.ToString() + "','" + FormatDateTime(OrderDate.Value, DateFormat.ShortDate) + "')"