2011-01-05 68 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