【问题标题】:SQL Error: The data types text and nvarchar are incompatible in the equal to operator.`in C#SQL 错误:数据类型 text 和 nvarchar 在等于运算符中不兼容。`在 C# 中
【发布时间】:2013-05-22 14:05:07
【问题描述】:

这段代码运行得很好,今天我尝试执行它,现在我遇到了这个异常:

我有这个 SQL 错误:

异常详情:System.Data.SqlClient.SqlException:数据类型 text 和 nvarchar 在等于运算符中不兼容。

我的代码是:

  protected Boolean is_valid(string a, string b) {

   SqlConnection connection = getConnection();
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = connection;

    cmd.CommandText = ("SELECT [Email_id] FROM [logintable] WHERE [Email_id] = @a AND [Password]=@b ");



    cmd.Parameters.Add("a", SqlDbType.NVarChar).Value = a;
    cmd.Parameters.Add("b", SqlDbType.NVarChar).Value = b;




    object obj = cmd.ExecuteScalar();
    connection.Close();
       ...
     }`

我的数据库字段类型是nvarchar(50)logintable 它只是一个简单的表,我在 VS 中使用 SQL Express。它有 3 个列,以 nvarchar(50) 作为其数据类型。而且它不允许空值。

我已尝试通过将 db 中的 nvarchar(50) 数据类型更改为 nvarchar(MAX) 来解决此错误。但这并没有什么不同。

另外,我尝试这样写我的查询:

cmd.CommandText = ("SELECT [Email_id] FROM [logintable] WHERE Email_id like @a AND Password like @b ");

但是,它没有解决或没有任何区别。请帮忙?提前致谢。

【问题讨论】:

  • logintable 的架构是什么?它有任何TEXT 列吗?你没有打开你的连接,你的参数名称是错误的。
  • 听起来您没有查看正确的字段或正在连接到具有 TEXT 类型的 db 字段的不同数据库。你确定它们是 varchar 吗?
  • 它只是一个简单的表,我在 VS 中使用 SQL express。它有 3 个列,以 nvarchar(50) 作为其数据类型。它不允许空值。
  • 安全问题总是相关的。

标签: c# .net sql


【解决方案1】:

确保“a”和“b”输入变量的长度小于 4000 个字符。 ado.net 驱动程序会自动将超过 4000 个字符的变量转换为文本变量。

尝试将您的代码更改为:

protected Boolean is_valid(string a, string b) {

    if (string.IsNullOrEmpty(a) || a.Length > 50) {
        throw new ArgumentException("a is invalid");
    }

    if (string.IsNullOrEmpty(b) || b.Length > 50) {
        throw new ArgumentException("b is invalid");
    }

    // Do Work

}

【讨论】:

  • 我在这里使用了一个简单的用户名和密码。我认为这不是问题。
  • 不过,您应该始终过滤您的输入(即,如果有人传递空值,您的函数将无法按预期工作)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-13
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
  • 2013-06-02
相关资源
最近更新 更多