【问题标题】:Error executing select query执行选择查询时出错
【发布时间】:2012-06-07 09:36:01
【问题描述】:

我有一个简单的选择查询,但执行它给我一个错误:

数据类型 text 和 varchar 在等于运算符中不兼容

代码如下:

string query = String.Format("Select SupplierId from tbl_Supplier where SupplierName ='" + cmbSupplierName.Text +"'");

SqlCommand cmd = new SqlCommand(query, connection);
SqlDataReader sdr = cmd.ExecuteReader();

while (sdr.Read())
{
   MessageBox.Show(sdr["SupplierId"].ToString());
}

SupplierName 的数据类型在数据库中是 TEXT。我不明白为什么它会给我varchar 的错误

【问题讨论】:

  • 这是线索 ---> “文本和 varchar 不兼容”。他们不是。那就是问题所在。 “文本”不是它听起来的样子......
  • 我正在查找我的查询中的问题。我很清楚它们不兼容
  • 我猜用户可以输入文本框。通过像这样通过字符串连接创建 SQL 语句,您将面临性能和安全问题。请阅读 SQL 注入。正确的做法是将参数添加到您的SqlCommand。
  • 但要解决您的问题 - 尝试将 SupplierName 列转换为 varchar(或 nvarchar)数据类型。
  • 文本已被弃用,你不应该使用它 - msdn.microsoft.com/en-us/library/ms187993.aspx

标签: c# sql-server tsql exception-handling ado.net


【解决方案1】:

也许我错过了什么,但第一件事是:

  1. 在使用前打开您的连接

除此之外,

  • 使用参数避免 SQL 注入
  • 使用using-statement 处理/关闭连接和命令(任何实现IDispoable)
  • 如果最大长度小于 8000 个字符,请使用VARCHAR 而不是TEXT,否则需要使用LIKE 而不是=(或将其转换为VARCHAR)

"比较运算符测试两个表达式是否相同。 比较运算符可用于除表达式之外的所有表达式 text、ntext 或 image 数据类型。下表列出了 Transact-SQL 比较运算符。”

http://social.msdn.microsoft.com/forums/en-US/transactsql/thread/6bd4c661-ea0b-435f-af78-097e61549d41/

【讨论】:

    【解决方案2】:

    如果 SupplierName 确实是一个文本字段,请尝试:

    cast(SupplierName as varchar(max)) = '...'
    

    文本是old and deprecated column type。在过去,它可能包含超过 8000 个字符,比 varchar 还多。从 SQL Server 2005 开始,varchar(max) 更好地填补了这个角色。

    这将是一个了不起的供应商,它的名称包含 8000 多个字符。

    【讨论】:

      猜你喜欢
      • 2015-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-14
      • 2012-11-04
      • 2012-07-30
      • 1970-01-01
      相关资源
      最近更新 更多