C # и SQL dynamic where where

У меня есть winform, где у меня много текстовых полей и comboboxes. Пользователь заполняет данные в каждое текстовое поле, которое мне нужно добавить в свой sql-запрос в качестве предложения where.

Я попытался создать список после проверки того, добавлен ли пользователь или выбрал элемент. Мне нужно знать, как добавить этот список в мой запрос.

Запрос без списка:

 int val;
 int val2;
 Int32.TryParse(category.SelectedValue.ToString(), out val);
 Int32.TryParse(type.SelectedValue.ToString(), out val2);

 SqlConnection conn = new SqlConnection();
 conn.ConnectionString = "Data Source=ANTHONY-LAP\\SQLEXPRESS;Initial Catalog=Tenant Management;Integrated Security=True";
 conn.Open();
 string search_channel = @"select c.[Name],cate.[Channel Category],tp.type,st.Status,c.Surface,
                         g.GOVERNATOR + ' ' + d.District + ' ' + cit.City + ' ' as [Address],
                         c.[Short term Price per night] as [Short term monthly amount],
                         c.[Long term price per month] as [Long term monthly amount],c.[Selling Price]
                         from[dbo].[Channel] c
                         inner join[dbo].[Governator] g on c.[Governator ID] = g.ID
                         inner join[dbo].[District] d on c.[District ID] = d.ID
                         inner join[dbo].[City] cit on c.[City ID] = cit.id
                         inner join[dbo].[Channel_Category] cate on c.[Channel Category ID] = cate.ID
                         inner join[dbo].[Channel_Type] tp on c.[Channel Type] = tp.id
                         inner join[dbo].[Channel_Status] st on c.[Channel Status] = st.ID
                         inner join[dbo].[Reservations] r on c.[ID] = r.[Channel ID]
                         where r.[Actual Date in] < " + res_from.Value.ToString("yyyy/MM/dd") + " and r.[Actual Date out] > " + res_to.Value.ToString("yyyy/MM/dd") +
                         "and c.[Channel Status]!= '2' and c.[Channel Category ID] =" + val + "and c.[Channel Type] ="
                          + val2 + " and c.Surface =" + Convert.ToInt32(surf.Text) +
                          " and c.[Short term Price per night]= " + Decimal.Parse(shrtrntprice.Text) +
                          "and c.[Long term price per month]=" + Decimal.Parse(lngrent.Text) + "and c.[Selling Price] =" + Decimal.Parse(sellprc.Text);

Этот запрос работает правильно, но я должен заполнить все элементы управления. Мне нужно знать, как выполнить условие, если пользователь заполняет только поля.

1
задан 13 August 2018 в 15:03

1 ответ

Я не уверен, что это лучший ответ, но он будет работать. Способ, которым я обошел это, - это динамически создать строку поиска с помощью C #. Если критерии поиска имеют значение, отличное от нуля, или «», например:

if(res_from != null && res_from != "")
   search_channel += "r.[Actual Date in] < @VALUE AND"; //You will need to add an AND/OR at the end and remove the trailing ones.

Я бы также не вставлял значения напрямую, когда вы открываете себя атакам SQL-инъекций.

cmd.Parameters.AddWithValue("@VALUE", (res_from == null) ? res_from.Value.ToString("yyyy/MM/dd) : "");

Вам понадобится код для удаления любых завершающих «AND» или «OR» в конце вашей строки поиска, и если строка поиска не используется, вам также необходимо удалить «WHERE» в начале.

Код для удаления последнего «AND» или «OR» будет выглядеть примерно так:

if(search_channel.EndsWith("WHERE"))
    search_channel = search_channel.Substring(0, myString.Length-5);
if(search_channel.EndsWith("AND"))
    search_channel = search_channel.Substring(0, myString.Length-3);
if(search_channel.EndsWith("OR"))
    search_channel = search_channel.Substring(0, myString.Length-2);

Не уверен, что это лучшее решение, но оно сработало для меня.

] Я внес поправки на основе комментария, и я также изменил AddWithValue для работы, даже если res_from имеет значение null, иначе вы получите сообщение об ошибке.

0
ответ дан 15 August 2018 в 17:05
  • 1
    Изменено на основе вашего комментария. Мое решение по-прежнему не является полным ответом, но OP должен быть в состоянии собрать все остальное на основе того, что я добавил. – Christopher Vickers 13 August 2018 в 13:56

Другие вопросы по тегам:

Похожие вопросы: