如何在 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。
我找不到我的问题的答案所以我不得不提出新问题。也就是说,我想问你如何使用 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。