Access Несоответствие типа данных даты в запросе sql - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь получить список заказов из моей базы данных, которые были заказаны между 2 датами. это мой запрос:

"SELECT * FROM Orders WHERE OrderDate >= '#" + DateTime.Parse(txtDate.Text) + "#' AND OrderDate <= '#" + DateTime.Parse(txtEndDate.Text) + "#'";

2 текстовых поля получают даты непосредственно от 2 ajax расширений календаря. я уже убедился, что первая дата предшествует второй, и я убедился, что данные, вставленные в базу данных, также были вставлены как '# "+ date +" #', но я "все еще несоответствие типов данных в выражении запроса" , Может кто-нибудь попытаться определить проблему с моим запросом?

Ответы [ 3 ]

0 голосов
/ 18 апреля 2020

Разделителями для выражений даты являются октоторпы , а не одинарные кавычки . И форматированное текстовое выражение для значения даты должно быть принудительным. Таким образом:

"SELECT * FROM Orders WHERE OrderDate >= #" + DateTime.Parse(txtDate.Text).ToString("yyyy'/'MM'/'dd") + "# AND OrderDate <= #" + DateTime.Parse(txtEndDate.Text).ToString("yyyy'/'MM'/'dd") + "#";

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

0 голосов
/ 19 апреля 2020

Вы должны использовать параметризованный запрос как для безопасности, так и для безопасности типов.

Для запросов к базе данных Access используйте ? в качестве заполнителя для передаваемых вами параметров.

OleDbCommand command = new OleDbCommand();

// I assume you have an oledb connection object and it is in open state
command.Connection = myConnection;
command.CommandText = "SELECT * FROM Orders WHERE OrderDate >= ? AND OrderDate <= ?";

// Please note that the name of the parameters are redundant and not used
command.Parameters.AddWithValue("StartDate", DateTime.Parse(txtDate.Text));
command.Parameters.AddWithValue("EndDate", DateTime.Parse(txtEndDate.Text));

// You can also use your data adatper. This is just an example
command.ExecuteReader();
0 голосов
/ 18 апреля 2020

Если у вас есть такие данные:

var txtDate = new { Text = "2020-08-01" };
var txtEndDate = new { Text = "2020-08-01" };

ваш запрос может выглядеть следующим образом:

var fromDate = DateTime.ParseExact(txtDate.Text, "yyyy-MM-dd",
                                 CultureInfo.InvariantCulture).ToString("yyyMMdd");

var toDate = DateTime.ParseExact(txtEndDate.Text, "yyyy-MM-dd",
                             CultureInfo.InvariantCulture).ToString("yyyMMdd");

var query =
    $"SELECT * FROM Orders WHERE OrderDate>='{fromDate}' AND OrderDate<='{toDate}'";

или последняя часть может быть:

var query =
    $"SELECT * FROM Orders WHERE OrderDate BETWEEN '{fromDate}' AND '{toDate}'";
...