如何在C#中将ORKE%用于两个或多个带OR的字段

时间:2017-02-07 11:51:34

标签: c# sql sql-like

我找不到我的问题的答案所以我不得不提出新的问题。也就是说,我想问你如何使用文本框中的LIKE +值+% - 通配符(缺少字母)但是对于两个或更多字段。当我在下面的代码中使用一个字段时它正在工作(我可以在我的DB E.G.中搜索从“A”开始的所有FirstNames ):

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

但是当我尝试将它用于两个字段时,它不起作用,(我不能在我的数据库中搜索,例如从“R”开始的任何FirstNames或LastNames。我没有得到任何字段没有任何事情发生):

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

提前感谢您的任何建议。

4 个答案:

答案 0 :(得分:3)

您不应该通过字符串连接来创建查询,否则您将应用程序公开给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.)返回您希望直接在服务器上执行它的结果。这可以帮助您检查更多问题。

答案 1 :(得分:0)

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

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 + "%");
}}

答案 2 :(得分:0)

如果你有一个动态数量的令牌,一个复杂的方法来完成你的任务是通过定义一个临时表并加入它:

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

答案 3 :(得分:-1)

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

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

然后你可以按如下方式使用它

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