Как игнорировать пустое текстовое поле при поиске? - PullRequest
0 голосов
/ 25 сентября 2018

Привет!Я хочу игнорировать пустые текстовые поля во время поиска данных в MySQL.

private void button4_Click(object sender, EventArgs e)
{con.Open(); 


 MySql.Command mycommand (SELECT * FROM table WHERE " +
"Name Like '" + textbox1.Text + "'" +
"Nachname Like '" + textbox2.Text + "'" +
"Alter Like '" + textbox3.Text + "'",


con);
read = mycommand.ExecuteReader();
dt.Load(read);
datagridView.DataSource = dt;
con.Close();}

1 Ответ

0 голосов
/ 25 сентября 2018

Существует несколько подходов к этому, но в идеале вы должны использовать параметризованные запросы, а не конкатенацию строк значений поиска;когда кто-то говорит, что ищет такие имена, как «O'reilly», ваш запрос обанкротился.(См. Google для "таблиц выпадения Бобби").

Однако, поскольку вы используете конкатенацию строк, почему бы просто не проверить значения полей на пустые при построении запроса?

В качестве альтернативы используйтепараметризованный запрос примерно так:

SELECT * 
FROM table 
WHERE (@p1 = '' OR `Name` LIKE @p1) 
  AND (@p2 = '' OR `Nachname` LIKE @p2) 
  AND (@p3 = '' OR `Alter` LIKE @p3)
;

При таком способе использования:

mycommand.CommandText = theQueryAbove;
mycommand.Parameters.AddWithValue("@p1", textbox1.Text);
mycommand.Parameters.AddWithValue("@p2", textbox2.Text);
mycommand.Parameters.AddWithValue("@p3", textbox3.Text);
var rdr = mycommand.ExecuteReader();

Лучшим решением, вероятно, является создание параметризованного запроса на основе соответствующих текстовых полей, который толькосодержит параметры для соответствующих.Name LIKE @p1 может быть быстрее, чем (@p1 = '' OR Name LIKE @p1);Оптимизатор MySQL может автоматически упростить его на основе значения @p1, но он все равно может ухудшить другие способы оптимизации такого запроса.

...