MS Access查询“WHERE”异常

问题描述:

我正在用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。

我不是超流利的数据库查询,所以我假设有另一种方法来运行此查询将工作。有什么想法吗??

Index字段中的一个数字或文本字段?

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

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

你最好使用参数化查询,虽然不是,因为这可能让你暴露的问题包含撇号索引,甚至更糟的是,注射攻击。

错误“标准表达式中的数据类型不匹配”表示查询中的数据类型与该字段的类型不匹配。

如果该字段中键入文本(和说,这包含数字),你有一个查询说:

SELECT * FROM myTable WHERE myField=2; 

...你会得到这个错误。你必须与周围的数引号运行:

SELECT * FROM myTable WHERE myField='2'; 

相反的情况(搜索型号的字段中的文本)会给你同样的错误。

Index和DateTime都是保留字。如果确实存在字段(列)名称,则甚至必须将它们放在方括号([])中,并尝试尽早更改它们。

+0

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