c# - 使用 3 个文本框过滤数据库结果

标签 c# winforms sqlite

我正在编写一个程序,用户可以通过 3 个文本框过滤数据库中的结果,但是,结果没有被正确过滤,因为如果一个框留空,它不会显示任何内容

private void textBox1_TextChanged(object sender, EventArgs e)
{
    con = new SQLiteConnection(cs);
    con.Open();

 if ((textBox2.Text==""||textBox.Text3=="")&&textBox1.Text!="")
    {
        adapt = new SQLiteAdapter("select data1, data2 from DataTable where data1 like '" + textBox1.Text + "%'", con);
        dt = new DataTable();
        adapt.Fill(dt);
        dataGridView1.Source = dt;
    }
    else if(textBox1.Text !="")
    {
        adapt = new SQLiteAdapter("select data1, data2 from DataTable where data1 like '" + textBox1.Text + "%' and data2 like '" + textBox2.Text + "%' and substr(data2,-2) like '" + textBox3.Text +"'", con);
        dt = new DataTable();
        adapt.Fill(dt);
        dataGridView1.Source = dt;

    }
con.close();
}

这是我在其中一个文本框上使用的代码,对于其他两个文本框,它看起来几乎相同,只是我更改了 if 子句条件。 我是否必须为每个文本框编写 9 个不同的子句,以便涵盖所有选项?有没有正确的方法?

最佳答案

我将参数化查询以防止 SQL 注入(inject),并使用 IFNULL 函数来帮助您。这样您就可以通过一个查询来涵盖所有场景。如果任何文本框为空,则该项目的 LIKE 子句基本上不会过滤掉任何内容:

string qry = @"SELECT 
    data1, 
    data2 
FROM DataTable 
WHERE 
    data1 LIKE IFNULL(@data1, data1) AND 
    data2 LIKE IFNULL(@data2, data2) AND
    SUBSTR(data2, -2) LIKE IFNULL(@data3, data3)";

要创建获取文本框值的参数,如果文本框为空,则将参数值设置为 null。对所有 3 个文本框执行此操作:

string data1 = null;
if(!string.IsNullOrWhiteSpace(textbox1.Text))
{
    data1 = textbox1.Text + "%";
}

SqlLiteCommand cmd = new SqlLiteCommand(qry, con);
SqlLiteParameter parData1 = new SqlLiteParameter("@data1", (object)data1 ?? DBNull.Value);
cmd.Parameters.Add(parData1);

现在您可以执行该命令。

关于c# - 使用 3 个文本框过滤数据库结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43830910/

相关文章:

objective-c - 确定 SQLite、CSV 或 Excel 中的架构字段类型

android - 如何在Android Room持久库中创建不迁移版本的表?

c# - 我得到 "Non abstract, non-.cctor-method in an interface"的原因是什么?

c# - AutoFilterRow 上的 XtraGridView 自定义过滤器

.net - DoubleClick 事件何时引发,而不是双击鼠标?

c# - 在后台工作线程中访问主线程控制

android - 使用 bool 逻辑(AND、OR、NOT)创建 SQLITE 查询

c# - FluentValidation:如何将所有验证消息放在一个位置?

c# - 无法从 WCF Rest 服务返回图像

c# - C#中的FTP客户端