2010-09-24 115 views
1

我正在用C#編寫一個應用程序,該應用程序使用System.Data.OleDb命名空間從.mdb文件讀取信息。我正在閱讀的表格包含有關樣本(數量,索引,日期等)的信息。當新項目添加到表格中時,數字和日期是必需條目,但索引是可選的,因此某些樣本沒有索引。我可以就好使用下面的代碼運行一個查詢:MS Access查詢「WHERE」異常

string id = "99"; 
OleDbConnection myConnection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Program Files\...\Database\data.mdb"); 
myConnection.Open(); 
OleDbCommand myCommand = myConnection.CreateCommand(); 
myCommand.CommandText = "SELECT SampNo, Index, DateTime FROM Sample WHERE SampNo=" + id; 
OleDbDataReader myReader = myCommand.ExecuteReader(); 
while (myReader.Read()) 
{ 
    Console.WriteLine("\t{0}\t{1}\t{2}", myReader["SampRef"], myReader["Index"], myReader["DateTime"]); 
} 

不過,其實我是想查詢表和檢索基於索引值的樣品,所以我想通過替換查詢行這樣做:

myCommand.CommandText = "SELECT SampNo, Index, DateTime FROM Sample WHERE Index=" + id; 

但是,當我運行它,它在「myCommand.ExecuteReader()」一行「條件表達式中的數據類型不匹配」拋出OleDbException。

我不是超流利的數據庫查詢,所以我假設有另一種方法來運行此查詢將工作。有什麼想法嗎??

回答

4

Index字段中的一個數字或文本字段?

如果它是一個文本字段,你需要做的是:

myCommand.CommandText = "SELECT SampNo, Index, DateTime FROM Sample WHERE Index='" + id + "'"; 

你最好使用參數化查詢,雖然不是,因爲這可能讓你暴露的問題包含撇號索引,甚至更糟的是,注射攻擊。

2

錯誤「標準表達式中的數據類型不匹配」表示查詢中的數據類型與該字段的類型不匹配。

如果該字段中鍵入文本(和說,這包含數字),你有一個查詢說:

SELECT * FROM myTable WHERE myField=2; 

...你會得到這個錯誤。你必須與周圍的數引號運行:

SELECT * FROM myTable WHERE myField='2'; 

相反的情況(搜索型號的字段中的文本)會給你同樣的錯誤。

2

Index和DateTime都是保留字。如果確實存在字段(列)名稱,則甚至必須將它們放在方括號([])中,並嘗試儘早更改它們。

+0

好,我甚至沒有注意到 – LittleBobbyTables 2010-09-24 15:57:05