【问题标题】:The data types text and varchar are incompatible in the equal to operator in C#数据类型 text 和 varchar 在 C# 中的等于运算符中不兼容
【发布时间】:2015-01-11 14:38:38
【问题描述】:

我正在尝试从employeeTable 访问数据empname,但我编写的代码给了我以下错误:

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

请提出解决方案

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    string Connection = "Data Source=(local);Initial catalog=Test;Integrated Security=true";
    string Query = "SELECT * FROM  EmployeeTable WHERE empname='" + comboBox1.Text + "' ;";

    SqlConnection conn = new SqlConnection(Connection);
    SqlCommand cmd = new SqlCommand(Query, conn);

    conn.Open();
    SqlDataReader reader = cmd.ExecuteReader();

    while (reader.Read())     
    {
        textBoxEmpName.Text = reader["EmpName"].ToString();
    }
}

【问题讨论】:

  • 您在哪一行收到此错误?并使用参数化查询。这种字符串连接对 SQL 注入攻击开放。
  • EmployeeTable.empname的类型是什么?
  • 哪一行给出了错误?另外,学习使用参数化查询。
  • 也没有理由创建临时变量来保存查询结果
  • 当我在组合框中选择 empname 时,它​​会给我错误消息。

标签: c#


【解决方案1】:

您无法将文本与 varchar 进行比较,但作为对将来遇到此问题的任何人的回答,只需将文本列转换为 varchar 以进行查询。

SELECT * FROM  EmployeeTable WHERE CONVERT(VARCHAR, empname) = '" + comboBox1.Text + "' ;";

始终使用parameters

SELECT * FROM  EmployeeTable WHERE CONVERT(VARCHAR, empname) = @comboBox";

【讨论】:

  • 不带通配符的 LIKE 也可以吗?
【解决方案2】:

如果目标字符串大小不足以表示 XML 实例,请尝试使用 VARCHAR(MAX)。

CONVERT(VARCHAR(MAX), empname)

【讨论】:

    【解决方案3】:

    xulfi afridi,实际上代码应该是:

    Select * from EmployeeTable Where Cast(empname as varchar(max)) = @combobox

    【讨论】:

      【解决方案4】:

      xulfi afridi,

      您可以使用 CAST (https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql#syntax) 代替 CONVERT,如下所示:

      CAST (表达式 AS data_type[(length)]);

      因此,解决方案将是: Select*from EmployeeTable Where Cast(varchar,empname)='@combobox'

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多