У меня есть 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);
Этот запрос работает правильно, но я должен заполнить все элементы управления. Мне нужно знать, как выполнить условие, если пользователь заполняет только поля.
Я не уверен, что это лучший ответ, но он будет работать. Способ, которым я обошел это, - это динамически создать строку поиска с помощью 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, иначе вы получите сообщение об ошибке.