【问题标题】:The data types text and varchar are incompatible in the equal to operator数据类型 text 和 varchar 在 equal to 运算符中不兼容
【发布时间】:2013-02-28 10:26:56
【问题描述】:

我正在尝试访问数据网格视图中数据库中的所有记录,具体取决于通过表单登录的用户类型,该表单分别具有用户名和密码的 2 个文本框,并显示提交按钮记录。但是我编写的代码给了我以下错误:数据类型 text 和 varchar 在等于运算符中不兼容。请提出更改建议。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Configuration;
using System.Data.SqlClient;


namespace Login_form
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {



        }

        private void button1_Click(object sender, EventArgs e)
        {

            string str = ConfigurationSettings.AppSettings["constring"].ToString();
            SqlConnection sqlcon = new SqlConnection(str);


            try
            {
                sqlcon.Open();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }


            SqlCommand sqlcmd = new SqlCommand("select user_type from employee where user_name='" + textBox1.Text + "'and pwd= '" + textBox2.Text + "' ;", sqlcon);


            SqlDataReader myReader = sqlcmd.ExecuteReader();

            string user_type=string.Empty;

            while(myReader.Read())
            {
            user_type= myReader["user_type"].ToString();
            }

            sqlcon.Close();



            sqlcon.Open();
            SqlCommand sqlcmd2 = new SqlCommand("select * from employee where user_type= '" +user_type + "'", sqlcon);
            SqlDataReader myReader2 = sqlcmd2.ExecuteReader();

          /*  SqlDataAdapter sqladapter = new SqlDataAdapter(sqlcmd2);
            DataSet ds = new DataSet();
            sqladapter.Fill(ds);
            dataGridView1.DataSource = ds.Tables[0];*/

            DataTable dt = new DataTable();
            dt.Columns.Add("ID", typeof(string));
            dt.Columns.Add("Name", typeof(string));
            dt.Columns.Add("Email_ID", typeof(string));
            dt.Columns.Add("Contact", typeof(string));
            dt.Columns.Add("Address", typeof(string));

            while (myReader2.Read())
            {
                DataRow dr = dt.NewRow();
                dr["ID"] = myReader2["ID"];
                dr["Name"] = myReader2["user_name"];
                dr["Email_ID"] = myReader2["Email_ID"];
                dr["Contact"] = myReader2["Contact"];
                dr["Address"] = myReader2["Address"];
                dt.Rows.Add(dr);
            }


            dataGridView1.DataSource = dt;


            sqlcon.Close();
        }

    }
}

【问题讨论】:

  • While(myreader.Read) 之后您尝试从 myreader2 获取数据?
  • 您的错误发生在sqlcmd.ExecuteReader(); 还是sqlcmd2.ExecuteReader();
  • 您的错误发生在哪一行?
  • 你的代码很乱。
  • 你的代码容易受到 Sql Injection 的攻击......

标签: c# database winforms sqldatareader


【解决方案1】:

这是一个简单的数据库问题。

在数据库生成脚本更改中:

columnname text NULL,

到:

columnname varchar(number of chars) NULL,

在您的情况下,列名将是“user_name”或“user_type”

出现此问题,因为 SQL-Type 文本!不兼容与字符串比较!

只要将类型从 text 更改为 varchar(),操作就应该可以工作了

【讨论】:

  • 当然VARCHAR(MAX) 可用于您想要存储任意大文本值的情况。
  • 有没有办法让 linq 与这样的列一起工作?因为我现在不能换桌子。
  • @MosheG 据我所知,没有。问题是 SQL 类型实际上并不“兼容”用作字符串。因此,唯一的解决方法是更改​​ SQL 列的数据类型
  • 这真是太棒了,四年多之后,这仍然是 EF 的问题。当旨在抽象出数据库知识的工具在本应简单的任务中完全失败时,我喜欢它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
相关资源
最近更新 更多