2017-02-07 10 views
-1

Я не мог найти ответ на свою проблему, поэтому мне пришлось задать новый вопрос. А именно, я хотел бы спросить вас, как использовать значение LIKE + из текстового поля + с% - подстановочные знаки (отсутствующие буквы), но для двух или более полей. Когда я использую ниже код для одной области он работает (и я могу найти в моем DB EG все FirstNames, который начинается с «А»):Как использовать LIKE% для двух или более полей с OR в C#

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

Но когда я пытаюсь использовать его для двух полей, это не работает (а й я не могу найти в моей БД, например, любые FirstNames или LastNames, который начинается с «R» Я не получал никаких ошибок просто ничего не произойдет..):

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

Спасибо вы заранее за любые советы.

+6

Пожалуйста, не вводите пользовательский ввод непосредственно в свой запрос, вместо этого используйте параметризованные запросы. Ваш код открыт для [SQL Injection] (http://www.bobby-tables.com/)! –

+0

Что генерирует сгенерированный SQL? –

+3

Определить * Это не работает *. –

ответ

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 
} 

Можно также проверить, что запрос в настоящее время вы создаете в вашем приложении (просто установить точку останова перед выполнением или просто войти его где-нибудь в файл ЭФ) возвращает результаты, которые вы могли бы ожидать в случае, если вы хотите выполнить его непосредственно на сервере. Это может помочь вам изучить еще несколько проблем.

+0

Я скорректировал свой код аналогично вашим предложениям, и он работает так, как ожидалось. – Adrian

-1

Это лучшая практика для первого присвоить значения текстового поля для строковых переменных затем использовать их, как показано ниже

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

Затем вы можете использовать его следующим образ

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

Остерегайтесь Ved, это делает вас очень уязвимым для SQL-инъекции! – Thomas

+0

Без обид я бы сомневался в том, что это хорошая практика. Было бы хорошей практикой полностью разделить логику формы из той части, где вы объединяете скрипты. Тогда предложение использовать LIKE ... '"+ Firsttext +'% '... в корне неверно. Во всяком случае, это не похоже на исходный вопрос. –

0

Я вижу, как @Jaroslav Кадльки являются делая это, он не ошибается, но у него есть одна проблема. Он использует лишенный метод. Для того, чтобы добавить Счетчики есть новый метод:

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

' AddWithValue' имеет свои собственные ограничения. Создание 'SqlParameter 's с явным набором текста и размерами дает прогнозируемые результаты. –

+0

@RowlandShaw +1. В дополнение к этому AddWithValue не позволяет указать ограничение размера для типов nvarchar - посмотрите на использование в моем ответе. Если вы это сделаете, вы делаете вид службы для SQL Server –

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.

+0

Было бы лучше использовать его таким образом 'cmd.Parameters.Add (новый SqlParameter ($" @ p {i} ", SqlDbType.NVarChar, 255) .Value = $"% {token}% ");' Это позволяет вам подсказывать SQL Server, какой тип данных, с каким размером он будет работать, с малой производительностью. –

+0

Интересная идея. Я никогда об этом не думал. – Alexei

 Смежные вопросы

  • Нет связанных вопросов^_^