2011-01-05 67 views
0

我正在寫一個使用SQLite和C#的WinForms數據庫應用程序。我有一個失敗的sqlite查詢,並且我不確定哪裏出錯,因爲我嘗試了所有我能想到的。看看我的C#SQLite查詢,我做錯了什麼?

public DataTable searchSubs(String businessName, String contactName) 
    { 
     string SQL = null; 

     if ((businessName != null && businessName != "") && (contactName != null && contactName != "")) 
     { 
      // provided business name and contact name for search 
      SQL = "SELECT * FROM SUBCONTRACTOR WHERE BusinessName LIKE %@BusinessName% AND Contact LIKE %@ContactName%"; 
     } 
     else if ((businessName != null && businessName != "") && (contactName == null || contactName == "")) 
     { 
      // provided business name only for search 
      SQL = "SELECT * FROM SUBCONTRACTOR WHERE BusinessName LIKE %@BusinessName%"; 
     } 
     else if ((businessName == null || businessName == "") && (contactName != null && contactName != "")) 
     { 
      // provided contact name only for search 
      SQL = "SELECT * FROM SUBCONTRACTOR WHERE Contact LIKE %@ContactName%"; 
     } 
     else if ((businessName == null || businessName == "") && (contactName == null || contactName == "")) 
     { 
      // provided no search information 
      SQL = "SELECT * FROM SUBCONTRACTOR"; 
     } 
     SQLiteCommand cmd = new SQLiteCommand(SQL); 
     cmd.Parameters.AddWithValue("@BusinessName", businessName); 
     cmd.Parameters.AddWithValue("@ContactName", contactName); 
     cmd.Connection = connection; 
     SQLiteDataAdapter da = new SQLiteDataAdapter(cmd); 
     DataSet ds = new DataSet(); 
     try 
     { 
      da.Fill(ds); 
      DataTable dt = ds.Tables[0]; 
      return dt; 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show(e.ToString()); 
      return null; 
     } 
     finally 
     { 
      cmd.Dispose(); 
      connection.Close(); 
     } 
    } 

我不斷得到一個錯誤,說它在%附近失敗。這一切都很好,但我認爲我錯了,但我不知道在哪裏!我嘗試添加圍繞「喜歡」變量單引號,像這樣:

SQL = "SELECT * FROM SUBCONTRACTOR WHERE Contact LIKE '%@ContactName%'"; 

,並坦白地說,這是所有我能想到的。有人有主意嗎?

+0

值。 IsNullOrEmpty()'而不是單獨的比較到'null'和'「」' – juharr 2011-01-05 02:36:15

+0

@juharr:好的一點,我會改變他們。謝謝! – CODe 2011-01-05 02:42:11

+0

「返回沒有記錄」不會給應答者帶來任何有用的信息。你可以在'cmd'執行時設置斷點,並檢查sql查詢字符串和參數a重新正確。 – 2011-01-05 02:54:30

回答

2

因爲您正在使用參數值,所以不需要'%'。所以,你應該有類似

SQL = "SELECT * FROM SUBCONTRACTOR WHERE Contact LIKE @ContactName「;

的‘%’將需要添加到是我可以建議使用`字符串傳遞給參數

var contactNameSearch = string.Format("{0}%", contactName);
cmd.Parameters.AddWithValue("@ContactName", contactNameSearch);

+0

太棒了!非常感謝你的幫助。此外,只是一個小的變化,string.Format(「%{0}%...基於我的問題。謝謝! – CODe 2011-01-05 02:58:47

+0

不確定sqllite的細節,但作爲一般規則,在開始時放置'%'的字符串意味着全表掃描,而不是使用你在這些列上創建的任何索引,如果它只有一小部分數據,那麼它可能不是什麼大不了的。 – 2011-01-05 03:31:04