Amar chand123 Ответов: 2

Проблема Datetimepicker в C# winform


я использую два DateTimePicker для отображения данных из моей базы данных

Этот код работает нормально, но проблема начинается, когда я выбираю дату в моем первом DateTimePicker may-2019 Code Break in my Code Break Point is --con.Открыть();

Показать Ошибку :

Необработанное исключение типа 'System.Data.OleDb.OleDbException' произошло в System.Data.dll

Дополнительная информация: неопределенная ошибка

в моей базе данных дата это

номер -- дата
1-----1/2/2020
3-----10/3/2020
5-----11/6/2020
6-----17/6/2020

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

частная считать недействительным ()
{
OleDbConnection con = new OleDbConnection(ConfigurationManager.ConnectionStrings["Тест"].Параметр connectionString);
строка sql1 = "select count(Number) as totalcount from customer Where [Date] between @From and @To ";

против.Open(); // это точка останова кода
Объект oledbcommand СК = новый объект oledbcommand(на сервере sql1, кон);
sc.параметры.AddWithValue ("@From", dtpFrom.Text);
sc.параметры.AddWithValue ("@To", dtpTo.Text);
OleDbDataReader reader;
читатель = СК.Метода executereader();
в то время как (читатель.читать())
{
var f = reader["totalcount"].Метод toString();
var a = (f == "" ? 0 : преобразовать.ToInt32(f));
лабкоунт.Текст = а.Метод toString();
}
}

2 Ответов

Рейтинг:
1

OriginalGriff

Это средство выбора даты и времени, и вы используете столбцы даты и времени в своей БД.
Так почему же вы используете текстовую версию значения DTP?

sc.Parameters.AddWithValue("@From", dtpFrom.Text);
sc.Parameters.AddWithValue("@To", dtpTo.Text);
Когда вы делаете это, вы преобразуете значение DateTime в строку, передаете его движку БД, который пытается преобразовать его обратно в объект DATETIME, и получает его неправильно.
Передайте непосредственно само значение DateTime, и никакие преобразования не должны происходить, так что это более эффективно, и оно должно работать:
sc.Parameters.AddWithValue("@From", dtpFrom.Value);
sc.Parameters.AddWithValue("@To", dtpTo.Value);

Да, и "дата" - это зарезервированное слово во многих движках БД, поэтому его, вероятно, нужно цитировать, когда вы его используете, или лучше изменить на более значимое имя: "ExpiryDate", возможно, или "InsertDate", возможно.


Amar chand123

я пробовал это раньше но не получилось
Показать ошибку
Необработанное исключение типа 'System.Data.OleDb.OleDbException' произошло в System.Data.dll

Дополнительная информация: несоответствие типов данных в выражении критериев.

OriginalGriff

Проверьте вашу БД. Вы пробовали в магазине Дарте информация в текстовом столбце? Если это так, измените его на столбец даты или времени - и я готов поспорить, что вы обнаружите, что это также не работает, потому что что-то там не является действительной датой ... и сначала тебе нужно это исправить.

Amar chand123

в БД мой тип данных столбца-Дата/Время, а формат-ShortDate

но проблема не в этом, потому что код работает нормально
Проблема в том, что если я выберу дату до мая 2019 года или после июня 2021 года, то мой разрыв кода и точка разрыва кода будут--- con.Открыть();

OriginalGriff

Если он не работает на открытой линии, то проблема вовсе не в дате, а в строке подключения. Us eteh debugger, чтобы точно узнать, что он содержит.

Мы не можем сделать это для вас!

Amar chand123

я знаю проблему в строке подключения, но я не знаю, почему код ломается, когда я выбираю дату до мая-2019 или после июня-2021, я не знаю, какая связь между моей датой DateTimePicker и моей строкой подключения, потому что когда я выбираю дату между июнем-2019 и маем-2021 код работает нормально без каких-либо ошибок

OriginalGriff

Это не так, если он выходит из строя при открытии, то значения в DTP еще не были использованы.

Поставьте точку останова на открытой линии и посмотрите, что именно находится в строке соединения.

Рейтинг:
1

Maciej Los

Заменить этот:

string sql1 = "select count(Number) as totalcount from customer Where Date between @From and @To ";

с:
string sql1 = "select Nz(count(Number),0) as totalcount from customer Where [Date] between ? and ? ";


Затем...
sc.Parameters.Add(new OleDbParameter(){Type= OleDbType.Date, Value=dtpFrom.Value});
sc.Parameters.Add(new OleDbParameter(){Type= OleDbType.Date, Value=dtpTo.Value});
int result = (int)sc.ExecuteScalar();


Примечание № 1: Date является зарезервированное слово[^] для MS Access database engine, поэтому он должен быть дополнен [] скобки.
Примечание № 2: OleDb использует неназванные параметры.
Примечание № 4: Функция Nz[^] используется для замены NULL значением по умолчанию.
Примечание № 4: Воспользуйся Объект oledbcommand.Метод ExecuteScalar (System.Data.OleDb) | Microsoft Docs[^] чтобы получить одно значение.


Amar chand123

я использую [дату], но проблема не в [дате]
если я выберу свой первый DateTimePicker 01/06/2020 результат будет показан правильно -- 2
и если я выберу дату 01/01/2020 результат будет показан правильно ---4

но когда выбирается дата до мая/2019 года в DateTimePicker мой код сломался
я не знаю, почему мой код сломается, если я выберу дату до мая/2019 года

Maciej Los

Вы должны передать правильные значения дат вместо строк. Если на уровне базы данных столбец [Date] является типом строки, вы должны немедленно изменить его на тип данных date.