如何在 C# 中使用 OR 对两个或多个字段使用 LIKE %

How to use LIKE % for two or more fields with OR in C#

我找不到我的问题的答案所以我不得不提出新问题。也就是说,我想问你如何使用 LIKE +textbox+ 中的值和 % - 通配符(缺少字母)但用于两个或多个字段。当我在一个字段中使用下面的代码时它正在工作(并且我可以在我的数据库中搜索所有从 "A" 开始的名字):

"SELECT * FROM customer WHERE FirstName LIKE '"+TextBox1.Text + '%'+ "'";

但是当我尝试将它用于两个字段时,它不起作用,(a而且我无法在我的数据库中搜索,例如从 "R" 开始的任何 FirstNames 或 LastNames。我没有收到任何错误。只是什么也没发生):

"SELECT * FROM customer WHERE FirstName LIKE '"+TextBox1.Text + '%'+ "' OR LastName LIKE '" +TextBox2.Text + '%'+"'";

提前感谢您的任何建议。

您不应通过字符串连接创建查询,否则您会将您的应用程序暴露给 SQL Injection。更好地使用带参数的命令 - 这也将帮助您不必过多考虑可能导致您当前问题的字符串转义。

using (SqlCommand cmd = new SqlCommand())
using (SqlConnection conn = new SqlConnection("connectionString"))
{
       cmd.CommandText = "SELECT * FROM customer WHERE FirstName LIKE @first OR LastName LIKE @second";
       cmd.Parameters.Add(new SqlParameter("first", SqlDbType.NVarChar, 255).Value = "%" + TextBox1.Text + "%");
       cmd.Parameters.Add(new SqlParameter("second", SqlDbType.NVarChar, 255).Value = "%" + TextBox2.Text + "%");
       // todo: execute
}

您还可以验证您当前在应用程序中创建的查询(只需在执行前设置断点或简单地将其记录到文件 f.e 中)是否返回您期望的结果,以防您d 直接在服务器上执行。这可以帮助您检查更多问题。

最好先将文本框值分配给字符串变量,然后按如下方式使用它们

String Firsttext = TextBox1.Text;
String SecondText = TextBox2.Text;

那么就可以如下使用了

"SELECT * FROM customer WHERE FirstName LIKE '"+ Firsttext + "%" + "' OR LastName LIKE '" +SecondText + "%"+"'";

我看到@Jaroslav Kadlec 是怎么做的,他没有错,但他有一个问题。他正在使用 depricated 方法。要添加参数,有一种新方法:

using (SqlConnection conn = new SqlConnection("connectionString")){
conn.Open();
using (SqlCommand cmd = new SqlCommand())
{
    cmd.CommandText = "SELECT * FROM customer WHERE FirstName LIKE @first OR LastName LIKE @second";
    cmd.Parameters.AddWithValue("@first", TextBox1.Text + "%");
    cmd.Parameters.AddWithValue("@second", TextBox2.Text + "%");
}}

如果您有动态数量的令牌,执行任务的一种复杂方法是​​定义一个临时 table 并加入它:

using (var conn = new SqlConnection(connectionStr))
{
    conn.Open();
    using (var cmd = conn.CreateCommand())
    {
        var querySb = new StringBuilder(@"
            CREATE TABLE #temp (Token NVARCHAR(20) NOT NULL)");

        //tokensArray will contain texts from your text boxes
        for (int i = 0; i < tokensArray.Length; i ++)
        {
            querySb.Append($"INSERT INTO #temp VALUES(@p{i})");

            // parameterized query, to protect against SQL injection (input is coming from user)
            cmd.Parameters.AddWithValue($"@p{i}", $"%{token}%");
        }

        cmd.CommandType = CommandType.Text;
        cmd.CommandText = querySb.ToString();

        querySb.Append(@"; 
SELECT C.* 
FROM customer C 
    JOIN #temp T ON C.FirstName LIKE T.Token";

        // execute stuff
    }
}

您还可以考虑在连接字符串中发送标记,并使用存储过程拆分它们并在 T-SQL 中进行过滤。

归功于 this answer