我正在创建一个应用程序,我希望根据用户在文本框中输入的值显示DataGridView中的行。
对于Eg。 如果用户在文本框中输入BookName,则应在DataGridView中显示有关该书的所有详细信息。
我使用了以下编码:
SqlConnection objSqlConnection = new SqlConnection();
string connectionStringSettings = "Data Source =.; Initial Catalog = LibrarySystemManagement;Integrated Security = SSPI";
private void btnSearch_Click(object sender, EventArgs e)
try
{
objSqlConnection.ConnectionString = connectionStringSettings;
objSqlConnection.Open();
if ((txtBookName.Text != "") || (txtCategory.Text != ""))
{
SqlDataAdapter objSqlDataAdapter = new SqlDataAdapter("select * from LIBRARYBOOKDETAILS where Title = '"+txtTitle.Text+"'", objSqlConnection);
SqlCommandBuilder objSqlCommandBuilder = new SqlCommandBuilder(objSqlDataAdapter);
DataTable objDataTable = new DataTable();
objSqlDataAdapter.Fill(objDataTable);
BindingSource objBindingSource = new BindingSource();
objBindingSource.DataSource = objDataTable;
dataGridView1.DataSource = objBindingSource;
objSqlDataAdapter.Update(objDataTable);
objSqlConnection.Close();
}
}
catch (Exception e1)
{
MessageBox.Show(e1.Message + e1.Source);
}
但是上面的代码显示了表格中输入的所有行。我的意思是不根据条件重新行。
任何人都可以帮我找到用于根据条件检索数据的正确代码段吗?
请帮帮我。
提前致谢。
答案 0 :(得分:3)
您可以通过直接接受用户输入来打开SQL注入,尽管这是一个副作用。你为什么要在这部分中调用objSqlDataAdapter.Update(objDataTable);
?
虽然其他一切看起来都不错,但我会尝试两件事:
删除objSqlDataAdapter.Update(objDataTable);
来电 - 什么都没有被修改,那么更新内容是什么?此时,您应该只选择数据。这也是在更新表时修改表,并且该表充当BindingSource的数据源。
更改select命令以使用参数,看看这是否有所不同。此步骤具有防止SQL注入的额外好处。
所以改变这个:
SqlDataAdapter objSqlDataAdapter = new SqlDataAdapter("select * from LIBRARYBOOKDETAILS where Title = '"+txtTitle.Text+"'", objSqlConnection);
对此:
SqlCommand command = new SqlCommand("select * from LIBRARYBOOKDETAILS where Title = @Title", objSqlConnection);
command.Parameters.AddWithValue("@Title", txtTitle.Text);
SqlDataAdapter objSqlDataAdapter = new SqlDataAdapter(command);