【问题标题】:MS Access Query "WHERE" ExceptionMS Access 查询“WHERE”异常
【发布时间】:2010-09-24 23:54:50
【问题描述】:

我正在用 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,上面写着“标准表达式中的数据类型不匹配”。

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

【问题讨论】:

    标签: c# database ms-access


    【解决方案1】:

    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';
      

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 很好,我什至没有注意到
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-01
        • 2018-02-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多