我找不到我的问题的答案所以我不得不提出新的问题。也就是说,我想问你如何使用文本框中的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 + '%'+"'";
提前感谢您的任何建议。
答案 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 + "%"+"'";