您好我正在尝试使用datagridview
和combobox
搜索过滤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);
}
答案 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)
您不希望被安全公司审核并且有SQL注入问题。参数化您的查询是mySql支持它。