Member 9983063 Ответов: 4

Как выбрать данные между двумя датами в C# с помощью ms access


Привет, Ребята! я хочу знать как выбрать данные между двумя датами я использую запрос но я получаю нулевые данные пожалуйста помогите мне

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

DataSet dsa = новый набор данных();
DataTable dt1 = новый DataTable();
ассоциация прямых продаж.Таблицы.Добавить(dt1);
OleDbDataAdapter da = новый OleDbDataAdapter();
да = новый объект oledbdataadapter("выберите [Столбец1],[Столбец2],[Столбец3],[дата],[квитанция нет],[курьер] от [всего], где [Дата] между" + dateTimePicker2.Значение.ToShortDateString() + " и #" + dateTimePicker3.Значение.ToShortDateString() + "#", VCON);
да.Заполнить(ст1);

4 Ответов

Рейтинг:
2

Patrice T

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

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик - Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
Когда код не делает того, что ожидается, вы близки к ошибке.

Используйте отладчик, чтобы увидеть, какой запрос у вас действительно есть.
Вы увидите, что вторая дата встроена в"#", а первая-нет, этого достаточно, чтобы сделать запрос неудачным.
Также убедитесь, что 2 даты в виде строк находятся в ожидаемом формате.

В противном случае построение запроса так, как вы это делаете, - плохая идея, потому что это открывает дверь для sql-инъекции.
SQL-инъекция[^]


Рейтинг:
1

Karthik_Mahalingam

попробовать это

da = new OleDbDataAdapter("SELECT [Column1],[Column2],[Column3],[Date],[Receipt No],[Delivery Person] from [Total] Where [Date] between #" + dateTimePicker2.Value.ToShortDateString() + "# AND #" + dateTimePicker3.Value.ToShortDateString() + "#", VCON);


Рейтинг:
1

teja varma

используя системы.Данных.Поставщики sqlclient;

Соединение.CommandText = "Select * form table where Date between @stdate and @ldate;
Соединение.Параметры.Addwithvalue("@stdate","startdate");
Соединение.Параметры.Addwithvalue("@ldate","todate");


Richard Deeming

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

Рейтинг:
0

David_Wimbley

Если вы опубликуете свою схему и некоторые примеры данных, это поможет. Не видя вашей базы данных, к которой у меня нет доступа, я делаю некоторые вероятные предположения о первопричине.

Но чтобы уточнить, я поделюсь примером, который вы можете запустить в sql server (к сожалению, у меня нет доступа).

Этот пример больше подходит для того, чтобы показать проблему временных меток в вашем sql-запросе.

DECLARE @Dates TABLE 
(
 Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
 DateExample DATETIME NULL
);

INSERT INTO @Dates ( DateExample ) VALUES ('2016-09-08 20:30:32.843')
INSERT INTO @Dates ( DateExample ) VALUES ('2016-09-08 19:00:32.843')
INSERT INTO @Dates ( DateExample ) VALUES ('2016-09-08 18:30:32.843')
INSERT INTO @Dates ( DateExample ) VALUES ('2016-09-08 16:00:32.843')
INSERT INTO @Dates ( DateExample ) VALUES ('2016-09-08 15:00:32.843')
INSERT INTO @Dates ( DateExample ) VALUES ('2016-09-08 14:30:32.843')

--This returns nothing due to the time stamps being midnight and the time stamps in the data being
SELECT * FROM @Dates WHERE DateExample BETWEEN '2016-09-08 00:00:00.000' AND '2016-09-08 00:00:00.000'

--Returns results because it converts dateexample to a date, which makes the timestamps midnight.
SELECT * FROM @Dates WHERE CAST(DateExample AS DATE) BETWEEN '2016-09-08 00:00:00.000' AND '2016-09-08 00:00:00.000'


Первый оператор select учитывает временные метки, и поскольку вы снимаете свое время с передаваемых дат , вы сравниваете дату в 12:00 утра с другими датами с отметкой времени, которая, вероятно, является причиной того, что у вас нет никаких возвращенных данных.

Другая проблема, которая может возникнуть, заключается в том, что вы преобразуете дату в строку, и это может плохо сочетаться с доступом.

Второй запрос преобразует столбец dateexample в date, который создает метку времени 12:00 утра и работает с этим запросом.

Учитывая, что T-SQL не очень хорошо конвертируется в MS Access, у вас есть 2 варианта

1) Убедитесь, что ваши даты в предложении BETWEEN включают временные метки, соответствующие критериям того, что вы ищете. Возможно, Вам потребуется добавить 00:00:00 и 24:59:59.59 к датам начала и окончания вашего заявления BETWEEN, чтобы получить все действительные данные.

2) я думаю, что MS Access может иметь функции, которые преобразуют строки в дату и, в свою очередь, снимают с нее отметку времени. У меня нет установленного MS access, поэтому я не могу проверить это, но я думаю, что это возможно из быстрого поиска google.

ms access CAST - поиск в Google[^]


Опять же, у меня нет доступа к вашей базе данных, так что это может быть отключено. Если это так, то не стесняйтесь предоставить схему и прояснить свой вопрос.