我使用此代码使用textBox过滤我的dataGrid,它可以通过Id进行过滤,但如果我将其更改为按名称过滤(我只需更改" Id&#34 ;在带有" Name")的查询中,它不起作用,类似于"列名称"输入文本"是无效的。当为Id设置查询并输入一个字母时,会发生同样的错误,显然它只适用于数字。
以下是代码:
private void textBox_TextChanged(object sender, TextChangedEventArgs e)
{
try {
SqlConnection con = new SqlConnection(@"Data Source =.\SQLEXPRESS; AttachDbFilename = C:\Users\Sione\Documents\AcademiaSQLDB.mdf; Integrated Security = True; Connect Timeout = 30; User Instance = True");
con.Open();
string query = "select * from instrutor";
if (textBox.Text != "") // Note: txt_Search is the TextBox..
{
query += " where Nome =" + textBox.Text;
}
SqlCommand cmd = new SqlCommand(query, con);
cmd.ExecuteNonQuery();
SqlDataAdapter adp = new SqlDataAdapter(cmd);
DataTable dt = new DataTable("instrutor");
adp.Fill(dt);
instrutorDataGrid.ItemsSource = dt.DefaultView;
adp.Update(dt);
con.Close();
} catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
那么如何通过名称过滤dataGrid呢?通过Id过滤完美的思考,但它不是非常用户友好。感谢
答案 0 :(得分:0)
您需要使用'
打包过滤器
这一行:
query += " where Nome =" + textBox.Text;
成为
query += " where Nome ='" + textBox.Text + "'";
请注意,这是一个快速修复,您需要考虑@Dennis回答
答案 1 :(得分:0)
不要使用字符串连接来构建SQL查询,这将导致SQL injections。改为使用参数:
private SqlCommand CreateCommand(SqlConnection connection)
{
return new SqlCommand("select * from instrutor", connection);
}
private SqlCommand CreateCommand(SqlConnection connection, TextBox textBox)
{
var command = new SqlCommand("select * from instrutor where Nome = @nome",
connection);
command.Parameters.AddWithValue("@nome", textBox.text);
return command;
}
private void textBox_TextChanged(object sender, TextChangedEventArgs e)
{
// ...
using (var command = !string.IsNullOrEmpty(textBox.Text) ?
CreateCommand(conn, textBox) : CreateCommand(conn))
{
// ...
}
// ...
}
另请注意:1)SqlConnection
,SqlCommand
,SqlDataAdapter
实施IDisposable
并应予以处置(请参阅this); 2)无需执行cmd.ExecuteNonQuery();
。