Member 9983063 Ответов: 3

Я получаю ошибку, когда получаю данные между двумя датами


Привет Ребята,

Я получаю ошибку, когда получаю данные между двумя датами, как это

Дополнительная информация: синтаксическая ошибка в дате в выражении запроса '[Employee Name] = 'sajid lakha' и [Date] >= #22/12/2016 05:14:30:PM# и [дата] < #22/12/2016 05:14:30: PM'.

Что я уже пробовал:

DataSet dsa = new DataSet();
    DataTable dt = new DataTable();
    dsa.Tables.Add(dt);
    OleDbDataAdapter da = new OleDbDataAdapter();
    da = new OleDbDataAdapter("SELECT [Employee Name],[Column1],[column2],[column3],[Flavours],[Date] from [Total] where [Employee Name] = '" + employeedata + "' AND [Date] >= #" + dateTimePicker1.Text+ "# AND [Date] < #" + dateTimePicker1.Text + "#", connection);
    da.Fill(dt);
    dataGridView1.DataSource = dt;
    connection.Close();

3 Ответов

Рейтинг:
0

Dave Kreskowiak

Два слова: "параметризованные запросы".

Google для "атаки SQL-инъекций", чтобы узнать, почему использование конкатенации строк подвергает вашу базу данных риску.

Затем найдите в Google "параметризованные запросы C#" примеры того, как решить эту проблему, и исправьте свою проблему со строками даты и времени.


Рейтинг:
0

Patrice T

Цитата:
Синтаксическая ошибка в дате в выражении запроса '[Employee Name] = 'sajid lakha' и [Date] >= #22/12/2016 05:14:30:PM# и [дата] < #22/12/2016 05:14:30: PM'.

В сообщении об ошибке вторая дата отсутствует. # в конце. По некоторым причинам последнее # это не там, где должно быть.
В противном случае ваш запрос просто неверен, потому что 2 даты совпадают, исключая любой ответ.

Никогда не создавайте SQL-запрос таким образом
SQL-инъекция-Википедия[^]
SQL-инъекция[^]


Рейтинг:
0

Wendelius

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

Еще одна проблема - отсутствие использования блоков. Они должны использоваться для обеспечения правильного расположения таких объектов, как OleDbConnection и OleDbDataAdapter. Обратите внимание, что вы дважды инициализировали адаптер данных

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

Таким образом, код должен выглядеть примерно так

DataSet dsa = new DataSet();
DataTable dt = new DataTable();
dsa.Tables.Add(dt);
string sqlQuery = 
using OleDbconnection connection = new OleDbConnection(...)) 
   using (OleDbCommand command = new OleDbCommand ()) {
      command.Connection = connection;
      command.CommandText = @"SELECT [Employee Name],[Column1],[column2],[column3],[Flavours],[Date] 
FROM [Total] 
WHERE [Employee Name] = @name AND [Date] BETWEEN @start AND @end";
      command.Parameter.Add("@name", OleDbType.VarChar, 100).Value = employeedata;
      command.Parameter.Add("@start", OleDbType.Date).Value = DateTime.Parse(dateTimePicker1.Text).Date;
      command.Parameter.Add("@end", OleDbType.Date).Value = DateTime.Parse(dateTimePicker2.Text).Date;
   
      using (OleDbDataAdapter da = new OleDbDataAdapter(sqlQuery, connection)) {
         da.Fill(dt);
      }
   }
   connection.Close();
}
dataGridView1.DataSource = dt;
Код может содержать ошибки, это просто пример.

Другие заметки:
- В вашем исходном коде вы, кажется, используете значение из dateTimePicker1 как для начального, так и для конечного лимитов в вашем запросе. В этом примере я использовал dateTimePicker1 и dateTimePicker2
- Используйте значимые имена для переменных и объектов. Это значительно облегчает отладку и поддержку кода. Например, вместо того, чтобы dateTimePicker1 использовать StartDatePicker или что-то подобное
- особенно используйте осмысленные имена в объектах базы данных. Наличие таких имен столбцов, как Column1 или Column2, действительно затрудняет понимание запросов и обеспечение правильного использования правильных полей.