У меня есть форма C# с 6 фильтрами (5 полей со списком и 1 текстовое поле), которые пользователь может использовать для выполнения поиска. Проблема в том, что пользователь может оставить некоторые поля пустыми или использовать все сразу. Чтобы иметь отфильтрованный поиск, я использовал И при выполнении запроса SELECT, но проблема в том, что он вернет пустой или пустой поиск, когда некоторые из фильтров пусты. Если я сделаю каждое условие запросом, у меня будет около 700 и так запросов. Итак, я обыскал шкаф, я думаю, сценарий по этой ссылке
Игнорировать пустые текстовые поля при поиске в базе данных
using (SqlConnection conn = new SqlConnection(@"Data Source=(local);
Initial Catalog=inventory;
Integrated Security=True"))
{
conn.Open();
string query = "SELECT * FROM [dbo].[product] WHERE IsDeleted = '0'";
using (SqlCommand scmd = new SqlCommand())
{
if (!string.IsNullOrEmpty(cmbItem.Text))
{
query += " AND Item Like @Item";
scmd.Parameters.Add("@Item", SqlDbType.VarChar).Value = "%" + item + "%";
}
}
if (!string.IsNullOrEmpty(cmbBrand.Text))
{
query += " AND Brand Like @Brand";
scmd.Parameters.Add("@Brand", SqlDbType.VarChar).Value = "%" + brand + "%";
}
//...additional query
}
scmd.CommandText = query;
scmd.Connection = conn;
using (SqlDataAdapter sda = new SqlDataAdapter(scmd))
{
dataGridView1.Refresh();
DataTable dt = new DataTable();
sda.Fill(dt);
dataGridView1.DataSource = dt;
}
conn.Close();
}
И при выполнении поиска возникает такая ошибка;
'Недопустимое имя столбца 'IsNull'.'
Мой исходный запрос звучит примерно так. Но это ничего не выберет, если одно из условий where пусто/пусто.
SELECT * FROM [dbo].[product] WHERE Item = '" + item + "'
AND Brand = '" + brand + "'
AND Description = '" +desc + "'
AND Manufacturer = '" + manu + "'
AND Car = '" + car + "'
AND Year = '" + year + "'
Если я использую ИЛИ вместо И. Он выберет что-то вроде этого.
Ниже приведены изображения для идеального поиска.
Изображение для идеального выбора
Изображение для идеального выбора
Решено путем изменения IsDeleted='0' на 1=1
string query = @"SELECT * FROM[dbo].[product] WHERE 1=1";
что такое
item
иbrand
, почему бы вам не отправитьcmbItem.Text
иcmbBrand.Text
в запросепроверьте значение
query
перед выполнением команды и узнайте, почему там IsNull. скорее всего, часть "//...дополнительный запрос" неверна@ASh //... дополнительная часть запроса похожа на if (!string.IsNullOrEmpty(.. statement. но для другого фильтра для dsecription, производителя, автомобиля, года. Я просто опубликовал первые два, чтобы сократить его.
@styx item и brand — это строки, которые получают значение текстов cmbItem и cmbBrand.
@Jepher, а когда вы пытаетесь сделать исходный выбор (в своем приложении), вы получаете значения, которые хотите?
@styx, если есть какие-либо пустые параметры, он ничего не покажет. пользователь должен заполнить все параметры. если я использую ИЛИ вместо И, он покажет все, что соответствует параметрам.