C# 看看我的C SQLite查询,我做错了什么?

C# 看看我的C SQLite查询,我做错了什么?,c#,winforms,sqlite,C#,Winforms,Sqlite,我正在使用SQLite和C编写一个WinForms数据库应用程序。我有一个SQLite查询失败了,我不确定哪里出了问题,因为我已经尝试了我能想到的一切 public DataTable searchSubs(String businessName, String contactName) { string SQL = null; if ((businessName != null && businessName != "") &&

我正在使用SQLite和C编写一个WinForms数据库应用程序。我有一个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%'";

老实说,这就是我所能想到的。有人有什么想法吗?

因为您使用的是参数值,不需要“%”。所以你应该有

SQL=从联系人处选择*,如@ContactName

需要将“%”添加到传递给参数的值中

var contactNameSearch=string.Format{0}%,contactName;
cmd.Parameters。AddWithValue@ContactName,联系人名称搜索

我建议使用String.IsNullOrEmpty,而不是单独比较null和@juharr:好的,我会把它们改大。谢谢Return no records不会给回答者带来任何有用的信息。您可以在执行cmd时设置断点,并检查sql查询字符串和参数是否正确。太棒了!非常感谢你的帮助。另外,只是一个小小的更改,string.Format%{0}%。。。根据我的问题。谢谢不确定sqllite的具体内容,但一般来说,在字符串开头加“%”将意味着一次完整的表扫描,而不是使用您在这些列上创建的任何索引。如果只是一小部分数据,那么这可能不是什么大问题。