Не работает SQL запрос

Рейтинг: 1Ответов: 3Опубликовано: 22.04.2015

Использую SQLite в совокупности с WPF, C#

Имею несколько текстбоксов в программе, по значениям которых должна сортироваться и выводиться обратно в dataGrid таблица из БД

Код сортировки и вывода:

SQLiteConnection sqliteCon = new SQLiteConnection(dbConnectionString);
try
{
    sqliteCon.Open();
    string Query = "SELECT * FROM '" + selectedTable + "' WHERE Откуда='" + FromTextBox.Text + "' AND Куда='" + ToWhereTextBox.Text + "' AND Курорт='" + ResortTextBox.Text + "' AND ВылетС='" + FlightFromTextBox.Text + "' AND ВылетПо='" + FlightUntillTextBox.Text + "' AND (Цена BETWEEN '" + Convert.ToInt32(PriceFromTextBox.Text) + "' AND '" + Convert.ToInt32(PriceUntillTextBox.Text) + "') AND Количество<='" + Convert.ToInt32(CountOfToursTextBox.Text) + "';";
    SQLiteCommand createCommand = new SQLiteCommand(Query, sqliteCon);
    createCommand.ExecuteNonQuery();

    SQLiteDataAdapter dataAdp = new SQLiteDataAdapter(createCommand);
    DataTable dt = new DataTable(" '" + selectedTable + "' ");
    dataAdp.Fill(dt);
    DataGrid1.ItemsSource = dt.DefaultView;
    dataAdp.Update(dt);

    sqliteCon.Dispose();
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

Пример входных данных из textbox'ов:

Москва
Турция
Шарм-Эль-Шейх
22/04/2015
01/04/2015
14000
45000
3

В таблице БД есть точно такая запись, но почему-то вывода не происходит, в datagrid ничего не отображается... В чем проблема, подскажите пожалуйста.

Ответы

▲ 2

По поводу sqlinjection и использовании параметризированных запросов согласна с другими отвечающими.

По поводу почему не работает запрос в вопросе. Большая вероятность, что проблема с форматами дат. Какой тип данных для полей в базе "ВылетС" и "ВылетПо"? Какой там настроен формат дат, хранится ли там еще и время? В текстовых полях задается английский формат, но неизвестно какой формат задан в базе. Если в поле базы еще задано время, то равенство в запросе использовать нельзя, только BETWEEN.

Если Вы не уверены. что форматы совпадают, то можно сделать запрос по датам универсальным, например, разделить в коде дату на ДД ММ ГГГГ и уже в запросе преобразовывать их в дату:

WHERE ВылетС = DATEFROMPARTS(ГГГГ,ММ,ДД)

Если в базе в поле даты еще хранится время (например, тип smalldatetime), то перед сравнением можно и его преобразовать только в дату:

WHERE CONVERT(DATE, ВылетС )  = DATEFROMPARTS(ГГГГ,ММ,ДД)
▲ 1

Сделайте просто

SQLiteDataAdapter dataAdp = new SQLiteDataAdapter(Query, sqliteCon);

Промежуточную команду в вашем случае необязательно создавать.

Еще добавлю, что так как вы создаете запрос, его создавать нельзя. Такой способ создания неустойчив к sql injection. Нужно использовать команды с параметрами.

▲ 1

Запись даты в таком виде 22/04/2015 не правильная, правильно было бы 2015/04/22 Советую так же прочитать про Prepared Statements, при использовании такого подхода код будет нагляднее, и станет невозможным выполнение вредоносного кода со стороны клиента. https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare(v=vs.110).aspx