Типы данных text и varchar несовместимы в операторе равенства

Я пытаюсь получить доступ ко всем записям из базы данных в представлении сетки данных в зависимости от типа входа пользователя в систему через форму, имеющую 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();
        }

    }
}

person ankita alung    schedule 28.02.2013    source источник
comment
Пока (myreader.Read) и после этого вы пытаетесь получить данные из myreader2?   -  person Abdul Saboor    schedule 28.02.2013
comment
Ваша ошибка возникает sqlcmd.ExecuteReader(); или sqlcmd2.ExecuteReader();?   -  person Toon Casteele    schedule 28.02.2013
comment
в какой строке у вас возникает ошибка?   -  person Tanner    schedule 28.02.2013
comment
Ваш код очень грязный.   -  person Derek    schedule 28.02.2013
comment
ваш код уязвим для Sql Injection....   -  person Sandy    schedule 28.02.2013
comment
@toonCasteele на sqlcmd2   -  person ankita alung    schedule 28.02.2013


Ответы (1)


Это простая проблема с базой данных.

в скрипте генерации БД изменить:

columnname text NULL,

to:

columnname varchar(number of chars) NULL,

в вашем случае имя столбца будет "user_name" или "user_type"

эта проблема возникает из-за того, что текст SQL-Type !несовместим для сравнения со строками!

как только вы измените тип с text на varchar(), операция должна работать

person Vogel612    schedule 28.02.2013
comment
И, конечно же, VARCHAR(MAX) доступен для тех ситуаций, когда вы хотите хранить произвольно большие текстовые значения. - person Corey; 28.02.2013
comment
Есть ли способ заставить linq работать с таким столбцом? Так как я не могу изменить стол прямо сейчас. - person MosheG; 14.04.2016
comment
@MosheG, насколько мне известно, нет. Проблема в том, что тип SQL на самом деле не совместим для использования в качестве String. Таким образом, единственным исправлением является изменение типа данных столбца SQL. - person Vogel612; 14.04.2016
comment
Это действительно здорово, что более четырех лет спустя это все еще проблема с EF. Мне нравится, когда инструмент, предназначенный для абстрагирования знаний о базе данных, полностью и полностью терпит неудачу в том, что должно быть простой задачей. - person A.R.; 14.09.2017