MS Access查询“WHERE”异常

时间:2010-09-24 15:33:39

标签: c# database ms-access

我在C#中编写一个应用程序,它使用System.Data.OleDb命名空间从.mdb文件读取信息。我正在阅读的表包含有关样本的信息(数字,索引,日期等)。将新项目添加到表中时,数字和日期是必填项,但索引是可选的,因此某些样本没有索引。我可以使用以下代码运行查询:

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,该行显示“条件表达式中的数据类型不匹配”。

我对数据库查询不是很流利,所以我假设还有另一种方法可以运行这个查询。有什么想法??

3 个答案:

答案 0 :(得分:4)

Index字段是数字还是文本字段?

如果是文本字段,则需要执行此操作:

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

最好使用参数化查询,因为这样可以解决包含撇号的索引问题,甚至更糟的是注入攻击。

答案 1 :(得分:2)

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

如果该字段是Text类型(并说它包含数字),并且您有一个查询说:

SELECT * FROM myTable WHERE myField=2;

...你会得到这个错误。你必须在数字周围用引号运行它:

SELECT * FROM myTable WHERE myField='2';

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

答案 2 :(得分:2)

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