Как игнорировать пустое текстовое поле или поле со списком в SQL SELECT?

avatar
Jepher
8 апреля 2018 в 05:39
124
2
0

У меня есть форма 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";
Источник
styx
8 апреля 2018 в 06:13
0

что такое item и brand, почему бы вам не отправить cmbItem.Text и cmbBrand.Text в запросе

ASh
8 апреля 2018 в 06:21
0

проверьте значение query перед выполнением команды и узнайте, почему там IsNull. скорее всего, часть "//...дополнительный запрос" неверна

Jepher
8 апреля 2018 в 06:42
0

@ASh //... дополнительная часть запроса похожа на if (!string.IsNullOrEmpty(.. statement. но для другого фильтра для dsecription, производителя, автомобиля, года. Я просто опубликовал первые два, чтобы сократить его.

Jepher
8 апреля 2018 в 06:43
0

@styx item и brand — это строки, которые получают значение текстов cmbItem и cmbBrand.

styx
8 апреля 2018 в 06:50
0

@Jepher, а когда вы пытаетесь сделать исходный выбор (в своем приложении), вы получаете значения, которые хотите?

Jepher
8 апреля 2018 в 08:32
0

@styx, если есть какие-либо пустые параметры, он ничего не покажет. пользователь должен заполнить все параметры. если я использую ИЛИ вместо И, он покажет все, что соответствует параметрам.

Ответы (2)

avatar
DRapp
8 апреля 2018 в 12:57
0

Ваши исходные условия if/and должны работать, но вы можете столкнуться с ложным разрешением таблицы COLUMN и PARAMETER. Поскольку у вас есть пример

Item like @Item

если нет фактического параметра Item, SQL подразумевает использование собственного значения. Для этих типов запросов я пытаюсь добавить префикс к имени параметра, чтобы он соответствовал. Изменить на

Item like @parmItem

и, очевидно, измените строку имени параметра, чтобы она соответствовала ссылке "@parmItem". Таким образом, отсутствует двусмысленность в том, какое значение ищет механизм SQL.

Jepher
9 апреля 2018 в 09:06
0

проблема в том, что он выдает ошибку «Недопустимое имя столбца« IsDeleted »».

DRapp
9 апреля 2018 в 14:00
0

@Jepher, столбец «IsDeleted» является символьным или числовым. Если числовой флаг, измените «0», чтобы удалить кавычки просто IsDeleted = 0

Jepher
10 апреля 2018 в 02:05
0

все та же проблема. Я решил это, заменив 1 = 1.

avatar
Morteza Jangjoo
8 апреля 2018 в 10:39
0

вы можете использовать процедуру сохранения и установить для параметра значение по умолчанию

образец:

 create proc sptest
     @Fname nvarchar(50),
     @Lname nvarchar(50),
     @NCode nvarchar(12),
     @UserType int
     as

     SELECT DISTINCT PersonID,
                   FName,
                   LName,
                   NationalID,
                   UserType
            FROM   Persons 

            WHERE  
                    (FName LIKE('%' + @Fname + '%') OR (@Fname = ''))
                   AND (LName LIKE('%' + @Lname + '%') OR (@Lname = ''))
                   AND ((NCode = @NCode) OR (@NCode = ''))
                   AND ((UserType = @UserType) OR (@UserType = 0))

когда текстовое поле пусто или выпадающие списки не выбраны, получить всю запись