【问题标题】:System.Data.OleDb.OleDbException: Data type mismatch in criteria expressionSystem.Data.OleDb.OleDbException:标准表达式中的数据类型不匹配
【发布时间】:2013-12-23 10:16:10
【问题描述】:

这是我的代码:

OleDbCommand Cmd = new OleDbCommand();
Cmd.Connection = MyConn;
Cmd.CommandText = "SELECT * FROM catalogue WHERE id = '" + questionid + "'";

OleDbDataReader read = Cmd.ExecuteReader();

int id = 0;

while (read.Read())
{
    id = Convert.ToInt32(read["id"]);
}

这是它给我的错误:

Line 27:         Cmd.CommandText = "SELECT * FROM catalogue WHERE id = '" + questionid + "'";
Line 28: 
Line 29:         OleDbDataReader read = Cmd.ExecuteReader(); // The error is here
Line 30: 
Line 31:         int id = 0;

我知道 Stack Overflow 上也有 another question about the same issue,但它似乎没有解决我的问题(它可能会解决你的问题,所以我放了一个链接)。

【问题讨论】:

  • 你能指出它在哪一行抛出异常吗?代码似乎没问题。
  • questionididcatalogue 是相同/等效的数据类型。如果是这样,请确保 questionid 不为空。 @nvoigt 的观点很好,你应该使用参数

标签: c# sql .net ms-access oledb


【解决方案1】:

请了解using blocks 的所有可处置性,包括数据库连接、命令和读取器。

您的代码容易受到sql injection 的攻击,您可能希望通过使用参数来修复它。

最后,我怀疑数据库中的 id 字段是整数类型,因此在值周围使用引号是错误的。但是请阅读参数而不是修复它。无论如何,参数都会解决这个问题。

【讨论】:

  • 确实是整数类型。这就是我今天学到的东西!谢谢!
  • @think123 实际上,如果是SQL Server query,您的查询非常好,我对 OleDb 的经验还不够,但它的行为有点烦人。
  • @KingKing 是的,但我无法访问。我是 MySQL 出身,对这么严格的规则不是很熟悉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 2021-08-16
  • 1970-01-01
相关资源
最近更新 更多