C#MYSQL - 使用组合框和文本框搜索数据网格视图

时间:2016-04-19 13:52:15

标签: c# mysql datagridview combobox textbox

您好我正在尝试使用datagridviewcombobox搜索过滤textbox

我已成功完成,但只有在搜索ID列时才能正常工作。其他列只是崩溃显示以下消息:

  

您的SQL语法有错误;检查手册   对应于您的MariaDB服务器版本,以获得正确的语法   在第1行''LIKE'd%'附近

该错误消息中的 d 字母只是我尝试过滤搜索的字母。

有人可以帮我解决这个问题吗?

我的代码在

下面
string myConnection = "datasource=localhost;port=3306;username=root;password=;";
MySqlConnection conDatabase = new MySqlConnection(myConnection);
try
        {
            if (comboBoxSrchPatient.Text == "ID")
            {
                MySqlCommand cmd = new MySqlCommand("select * from clinic_inventory_system.patient WHERE ID LIKE '" + txtSearchPatient.Text + "%'", conDatabase);
                MySqlDataAdapter sda = new MySqlDataAdapter();
                sda.SelectCommand = cmd;

                DataTable dbdataset = new DataTable();
                sda.Fill(dbdataset);
                dataPatientGridView.DataSource = dbdataset;
            }
            else if (comboBoxSrchPatient.Text == "FIRST NAME")
            {
                MySqlCommand cmd = new MySqlCommand("select * from clinic_inventory_system.patient WHERE First Name LIKE '" + txtSearchPatient.Text + "%'", conDatabase);
                MySqlDataAdapter sda = new MySqlDataAdapter();
                sda.SelectCommand = cmd;

                DataTable dbdataset = new DataTable();
                sda.Fill(dbdataset);
                dataPatientGridView.DataSource = dbdataset;
            }

            else if (comboBoxSrchPatient.Text == "LAST NAME")
            {
                MySqlCommand cmd = new MySqlCommand("select * from clinic_inventory_system.patient WHERE Last Name LIKE '" + txtSearchPatient.Text + "%'", conDatabase);
                MySqlDataAdapter sda = new MySqlDataAdapter();
                sda.SelectCommand = cmd;

                DataTable dbdataset = new DataTable();
                sda.Fill(dbdataset);
                dataPatientGridView.DataSource = dbdataset;
            }

            else if (comboBoxSrchPatient.Text == "AGE")
            {
                MySqlCommand cmd = new MySqlCommand("select * from clinic_inventory_system.patient WHERE Age LIKE '" + txtSearchPatient.Text + "%'", conDatabase);
                MySqlDataAdapter sda = new MySqlDataAdapter();
                sda.SelectCommand = cmd;

                DataTable dbdataset = new DataTable();
                sda.Fill(dbdataset);
                dataPatientGridView.DataSource = dbdataset;
            }

            else if (comboBoxSrchPatient.Text == "CONTACT NUMBER")
            {
                MySqlCommand cmd = new MySqlCommand("select * from clinic_inventory_system.patient WHERE Contact Number LIKE '" + txtSearchPatient.Text + "%'", conDatabase);
                MySqlDataAdapter sda = new MySqlDataAdapter();
                sda.SelectCommand = cmd;

                DataTable dbdataset = new DataTable();
                sda.Fill(dbdataset);
                dataPatientGridView.DataSource = dbdataset;
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

3 个答案:

答案 0 :(得分:3)

您的字段名称包含空格 要在查询中使用它们,您需要将它们括在反引号(ALT + 096)

之间
MySqlCommand cmd = new MySqlCommand(@"select * from 
    clinic_inventory_system.patient WHERE `Last Name` LIKE ....";

说,尽快考虑更改查询以使用参数化查询

using(MySqlCommand cmd = new MySqlCommand(@"select * from 
            clinic_inventory_system.patient 
            WHERE `First Name` LIKE @name", conDatabase);
{
    cmd.Parameters.Add("@name", MySqlDbType.VarChar).Value = txtSearchPatient.Text + "%";
    MySqlDataAdapter sda = new MySqlDataAdapter();
    sda.SelectCommand = cmd;
    DataTable dbdataset = new DataTable();
    sda.Fill(dbdataset);
    dataPatientGridView.DataSource = dbdataset;
}

通过这种方式,您的代码更安全,因为不再可能针对您的数据库构建Sql Injection攻击,如果First Name包含单引号,您又不会再出现语法错误

答案 1 :(得分:0)

首先,使用名字,姓氏和联系号码,您需要正确地转义列。 由于您正在使用MariaDB,因此应使用反引号(`)来转义列名。

其次,您的年龄查询失败,因为您无法对数字列执行LIKE。你应该使用=(等于)。

希望有所帮助。

另外,如果您正在使用用户直接在SQL中提供的数据,请考虑切换到预准备语句。目前,您已开放SQL注入。

答案 2 :(得分:0)

你应该听Huw Jones。

您不希望被安全公司审核并且有SQL注入问题。参数化您的查询是mySql支持它。