C# 如何使用文本过滤datagridview?

C# 如何使用文本过滤datagridview?,c#,C#,因此,我正在做一个应用程序,我们可以在datagridview中查看数据库中的数据。我需要过滤一些东西,我只能用“数字”进行过滤,例如(IdProducts),这是我使用的代码 string query= "SELECT * FROM alunos where Estado="+textBox1.Text; if(a.open_connection() == true) { MySqlCommand cmd = new MySqlCommand(query, a.connection)

因此,我正在做一个应用程序,我们可以在datagridview中查看数据库中的数据。我需要过滤一些东西,我只能用“数字”进行过滤,例如(IdProducts),这是我使用的代码

string query= "SELECT * FROM  alunos where Estado="+textBox1.Text;
if(a.open_connection() == true)
{
    MySqlCommand cmd = new MySqlCommand(query, a.connection);
    MySqlDataReader dataReader= cmd.ExecuteReader();
    if(dataReader.HasRows)
    {
        DataTable dt= new DataTable();
        dt.Load(dataReader);
        dataGridView1.DataSource= dt;
    }

    dataReader.Close();
    a.close_connection();
}
在这段代码中,我试图过滤“Estado”列,它是文本,它给了我这个错误

where子句中的未知列“A”

“A”是我试图过滤的内容(是Estado专栏中的一个营地)

我的问题是,我怎样才能不仅用数字过滤,而且用文本过滤

string query= "SELECT * FROM  alunos where Estado="+textBox1.Text;
if(a.open_connection() == true)
{
    MySqlCommand cmd = new MySqlCommand(query, a.connection);
    MySqlDataReader dataReader= cmd.ExecuteReader();
    if(dataReader.HasRows)
    {
        DataTable dt= new DataTable();
        dt.Load(dataReader);
        dataGridView1.DataSource= dt;
    }

    dataReader.Close();
    a.close_connection();
}

您不需要更改代码来使用这样的参数化查询

string query= "SELECT * FROM  alunos where Estado=@state";
if(a.open_connection() == true)
{
    MySqlCommand cmd = new MySqlCommand(query, a.connection);
    cmd.Parameters.Add("@state", MySqlDbType.VarChar).Value = textBox1.Text;
    MySqlDataReader dataReader= cmd.ExecuteReader();
    if(dataReader.HasRows)
    {
        DataTable dt= new DataTable();
        dt.Load(dataReader);
        dataGridView1.DataSource= dt;
    }

    dataReader.Close();
    a.close_connection();
}
原始代码中的问题是由于将文本框中的字符串值串联在一起而没有在其周围添加引号。这样,解析器就被愚弄了,认为您正在命名一个字段,当然,找不到它

然而,仅仅在文本框周围添加单引号“解决”问题并不是一个真正的解决方案,因为您正在打开代码进行攻击。相反,如果使用参数化查询,则不会出现原始问题,可以避免sql注入,也不会因textbox.text属性中存在单引号而导致其他“语法错误”,而且数据库引擎可以优化查询,因为即使多次调用查询,也只需对其进行一次解析