2017-05-07 73 views
1

我正在編寫一個程序,其中用戶可以通過3個文本框過濾來自數據庫的結果,但是結果未被正確過濾,因爲如果一個框留空,它不會顯示任何使用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個不同的子句,以便涵蓋所有選項?有沒有正確的方法?

回答

1

我會參數化查詢以防止sql注入並使用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); 

現在您可以執行該命令。

+0

我在代碼中究竟如何使用它?如果我使用'adapt = new SQLiteDataAdapter(cmd);''我在'adapt.Fill(dt);'上得到一個Fill:SelectCommand.Connection異常。我對sqlite和winforms都比較陌生。 – EInherjar

+0

請參閱編輯,我忽略了設置連接。我正在寫這個而沒有測試它,你可能不得不自己填寫一些語法錯誤。重點是,正確使用'IFNULL'可以讓您爲任意數量的過濾器使用一個查詢。 – Crowcoder

+0

我得到了一個未命中的錯誤/提供給命令異常的參數不足,我沒有足夠的知識來知道什麼是錯誤的。 – EInherjar

0

在構造函數或的Form_Load線了文本框更改事件到一個處理程序:

textBox1.TextChanged += textBox1_TextChanged; 
textBox2.TextChanged += textBox1_TextChanged; 
textBox3.TextChanged += textBox1_TextChanged; 

,並動態建立WHERE子句,而不是9個條件:

con = new SQLiteConnection(cs); 
con.Open(); 
StringBuilder sb = new StringBuilder(); 

sb.Append("select * from DataTable where "); 
foreach (Control c in this.Controls) { 
TextBox t = c as TextBox; 
if (t != null) { 
    if (t.Length > 0) { 
    //In design-time set the TextBox Tag property to the SQL column name 
    sb.Append(t.Tag.ToString() + " like '" + t.Text + "%' and "); 
    } 
    } 
} 

string SQL = sb.ToString(); 
if (SQL.Length > 0) { 
    SQL = SQL.Substring(0, SQL.Length-5); 
} 


adapt = new SQLiteAdapter(SQL, con); 
dt = new DataTable(); 
adapt.Fill(dt); 
dataGridView1.Source = dt; 

您還應該使用存儲過程或支付 參數化命令。

+0

有三個文本框,我希望數據獨立地從輸入過濾器的文本框中進行更改。所以,我需要使用'textBox2.TextChanged + = textBox3_TextChanged;'?等等?另外,我是否把你寫在每個單獨的文本框中的代碼?請注意,我不知道存儲過程和參數化命令是什麼。 – EInherjar