Параметр SQL для ВСЕХ - PullRequest
2 голосов
/ 11 июля 2011

Мне было интересно, был ли параметр в SQL для всех (не *!). Например, я сейчас пишу таблицу поиска, и если пользователь не вводит что-то в текстовое поле, это будет означать игнорированиеэтот конкретный параметр и отобразить все из них для этого поля.Я понимаю, что вы могли бы создавать отдельные команды OLEDB или SQL для каждого сценария, и это сработало бы, но я просто хотел бы сделать это одной командой, где, если текстовое поле пустое, я просто проигнорировал бы его.До сих пор, что этот парень сказал, что я пытался, но не работал ... он сказал, что у меня было какое-то несоответствие типов

http://timothychenallen.blogspot.com/2007/06/sql-server-all-values-parameters-in.html

Это мой код для этой части прямо сейчас

da.SelectCommand = new OleDbCommand("SELECT *
                                       FROM TestQuery
                                      WHERE (VendorName = @VendorName) 
                                        AND CustomerName = @CustomerName", cs);

if (combo_VendorView.Text != "") 
  da.SelectCommand.Parameters.Add("@VendorName", OleDbType.VarChar).Value = combo_VendorView.Text.ToString();
  da.SelectCommand.Parameters.Add("@CustomerName", OleDbType.VarChar).Value = combo_CustomerView.Text.ToString();

  dsB.Clear();
  da.Fill(dsB);
  dgv_DataLookup.DataSource = dsB.Tables[0];

Скажем, если я оставлю txt.VendorName пустым, я хочу игнорировать этот параметр.Спасибо за вашу помощь!:)

ОБНОВЛЕННЫЙ КОД

 da.SelectCommand = new OleDbCommand("SELECT * 
                                        FROM TestQuery 
                                       WHERE (CustomerName = @CustomerName 
                                           OR @CustomerName IS NULL)", cs);
da.SelectCommand.Parameters.Add("@CustomerName", OleDbType.VarChar).Value = combo_CustomerView.Text.ToString();

Я использую ado.net visual Studio 2010, если это имеет значение для oledb (доступ), он хорошо выполняет поиск по параметрам, но когда нетвведите имя клиента, оно показывает только имена столбцов тестового запроса, но не содержит никакой информации ... я хочу, чтобы оно в основном было похоже на select * для этого одного столбца

Ответы [ 11 ]

1 голос
/ 11 июля 2011
combo_CustomerView.Text.ToString()  // is converting null to ''   

, поэтому используйте:

da.SelectCommand = new OleDbCommand("SELECT * FROM TestQuery WHERE CustomerName = @CustomerName OR @CustomerName = ''", cs);
1 голос
/ 11 июля 2011

вам, вероятно, нужен вариант ответа JNK, так как я думаю, что ваш пользовательский ввод, вероятно, вводится как пустая строка, а не NULL например

WHERE (Vendorname = @Vendorname OR @Vendorname = '')
AND (CustomerName = @Customername OR @Customername = '')

Это, конечно, может варьироваться от поля к полю.

1 голос
/ 11 июля 2011

Возможно ли, что @CustomerName не равно NULL, но равно "" (пустая строка)?

1 голос
/ 11 июля 2011

Используйте явную оценку NULL, как показано ниже:

WHERE (Vendorname = @Vendorname OR @Vendorname IS NULL)
AND (CustomerName = @Customername OR @Customername IS NULL)
1 голос
/ 11 июля 2011

Вы можете использовать оператор COALESCE в этом примере.Если ваш параметр был передан как null, или вы добавили логику для преобразования пустой строки в null, вы могли бы по существу сделать это:

SELECT *
FROM TestQuery
WHERE 
   VendorName = COALESCE(@VendorName,VendorName)
   AND CustomerName = COALESCE(@CustomerName, CustomerName)

Если VendorName был NULL, он просто проверил, равняется ли VendorNameVendorName, что всегда будет правдой.

0 голосов
/ 12 июля 2011

Если поле со списком не выбрано, зачем вообще беспокоиться о параметре в предложении where оператора SQL?У вас уже есть логика в поле со списком Vendor.

0 голосов
/ 11 июля 2011

Проблема в том, что вы никогда не устанавливаете @CustomerName в ноль. В вашем коде, если пользователь выберет пустую запись в ComboBox, параметр @CustomerName будет иметь пустую строку в качестве значения.

Вам нужно что-то вроде этого:

if(string.IsNullOrEmpty(combo_CustomerView.Text))
{
    da.SelectCommand.Parameters.Add("@CustomerName", OleDbType.VarChar).Value = DBNull.Value;
}
else
{
    da.SelectCommand.Parameters.Add("@CustomerName", OleDbType.VarChar).Value = combo_CustomerView.Text;
}

Кстати, пожалуйста, не вызывайте .ToString() для переменных, которые являются строками. Это похоже на сравнение логических переменных с true (или false).

0 голосов
/ 11 июля 2011

Я мало что делаю с .NET, но я предполагаю, что combo_CustomerView.Text.ToString() возвращает строку "Null" или пустую строку (""), когда поле со списком пусто. Что вы действительно хотите сделать, так это назначить литерал NULL. В псевдокоде:

If combo_box is empty then
    ...Parameters.Add().Value = Null
Else
    ...Parameters.Add().Value = combo_box.ToString()
End If
0 голосов
/ 11 июля 2011

ну, может, не лучше, но близко

set @VendorName = coalesce(@VendorName,'%')
set @CustomerName = coalesce(@CustomerName,'%')

SELECT * FROM TestQuery 
WHERE VendorName like @VendorName
AND CustomerName like @CustomerName

Теперь, если вы отправляете запрос (новый OleDbCommand ("SELECT * FROM TestQuery WHERE (VendorName = @VendorName) И CustomerName = @CustomerName", cs)), почему вы создаете динамический запрос?

Вот хорошая статья об этом http://weblogs.sqlteam.com/jeffs/archive/2007/09/18/sql-conditional-where-clauses.aspx

0 голосов
/ 11 июля 2011
da.SelectCommand = new OleDbCommand("SELECT * FROM TestQuery WHERE (@VendorName is null or VendorName = @VendorName) AND (@CustomerName is null or CustomerName = @CustomerName)", cs);
da.SelectCommand.Parameters.Add("@VendorName", OleDbType.VarChar).Value = string.isNullOrEmpty(combo_VendorView.Text) ? null : combo_VendorView.Text.ToString();
da.SelectCommand.Parameters.Add("@CustomerName", OleDbType.VarChar).Value = string.IsNullOrEmpty(combo_CustomerView.Text) ? null : combo_CustomerView.Text.ToString();
dsB.Clear();                
da.Fill(dsB);
dgv_DataLookup.DataSource = dsB.Tables[0];
...