Member 8840306 Ответов: 1

Как назначили, так и отображать дату значение на дату, используя объект sqlitedatareader в C# с использованием WPF


Я хочу прочитать значение datetime из базы данных Sqlite и назначить его элементу управления datepicker. Вот мой код, который я пытаюсь использовать:

try
            {
                sqlitecon.Open();

                string Query = "Select * from Customer_New where Cust_Id='" + val + "'  ";

                SQLiteCommand createCommand = new SQLiteCommand(Query, sqlitecon);
              //  createCommand.ExecuteNonQuery();
                SQLiteDataReader dr = createCommand.ExecuteReader();
                while(dr.Read()){
                if(!dr.IsDBNull(1))
                    date_open.DisplayDate = dr.GetDateTime(1);
                if(!dr.IsDBNull(2))    
                    Date_Joining.DisplayDate = dr.GetDateTime(2);
                if(!dr.IsDBNull(3))
                    txt_Title.Text = dr.GetString(3);
                if(!dr.IsDBNull(4))
                    txt_cardnum.Text =dr.GetString(4);
                }
                sqlitecon.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

Приведенный выше код выполняется при событии загрузки формы .поэтому при загрузке формы он должен загрузить значение даты из таблицы БД в средство выбора даты .но форма открывается с окном сообщения, которое показывает исключение "указанное приведение недопустимо". Затем он не может загрузить какое-либо значение из БД, и если я удалю поля даты из назначения в цикле while, то остальные текстовые поля будут правильно назначены форме . Мой db foramt даты :MM/DD/YYYY и имеет тип datetime . При отладке поставьте точку останова в "date_open.DisplayDate = dr.GetDateTime(1);" он показывает системную дату и время .Мои таблицы БД имеют следующую последовательность: Cust_id | date_open | Date_Joining|..... пожалуйста, помогите

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

нуль....................................................................

Pheonyx

если вы пройдете через свой код и перед выполнением любой из строк dr.GetDateTime просмотрите dr.GetDateTime(1) или dr.GetDateTime(2) в окне просмотра, какие значения вы получите?

ZurdoDev

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

Это очень просто, но мы не можем запустить ваш код, поэтому только вы можете это сделать.

1 Ответов

Рейтинг:
2

MadMyche

Перво - наперво; your code is vulnerable to SQL-инъекция!
Никогда, никогда, никогда создайте SQL-запрос, связав команду и пользовательский ввод. Правильный способ добавления пользовательского ввода в запрос-это набор параметров команды

try
{
        sqlitecon.Open();

// BAD: string Query = "Select * from Customer_New where Cust_Id='" + val + "' ";
        string Query = "Select * from Customer_New where Cust_Id= ? ";

        SQLiteCommand createCommand = new SQLiteCommand(Query, sqlitecon);
        createCommand.Parameters.AddWithValue("val", val);

// continue on with existing code

Следующая вещь, чтобы говорить о "Мой db foramt даты :MM/DD/YYYY и имеет тип datetime"; Даты и время на самом деле являются числовыми значениями; и то, что вы видите, основано либо на настройках вашей локальной системы, либо на настройках отображающего приложения. Возможно, вы действительно захотите проверить, что это за тип, поскольку SQLite не имеет "истинного" типа DateTime.
SQLite - Тип Данных - Tutorialspoint[^]

Судя по тому, как выглядит ваш запрос, кажется, что должна быть возвращена только одна запись. Если это так, то вам не нужно WHILE loop; так как должно быть возвращено только максимум 1 строка. Вместо этого вы должны использовать HasRows свойство (которое должно использоваться даже в том случае, если возвращается несколько записей, обертывающих цикл).

Я также был бы склонен сначала захватить значения из вашего DataReader в локальные переменные, чтобы убедиться, что вы получаете то, что думаете, а затем заполнить элементы управления формой из этих локальных значений. Это просто может помочь определить, что именно у вас происходит, поскольку вы можете видеть типы/значения этих локальных переменных, когда вы попадаете в точку останова.

Вышеприведенные 2 абзаца дали бы мне код, выглядящий примерно так
if (!dr.HasRows) { throw new Exception("No Rows Returned"); }
else {
  var DisplayDateOpen = dr.GetDateTime(1);
  var DisplayDateJoin = dr.GetDateTime(2);
  var Title = dr.GetString(3);
  var CardNum = dr.GetString(4);

// insert breakpoint here

// check/validate values

  date_open.DisplayDate = DisplayDateOpen;
  Date_Joining.DisplayDate = DisplayDateJoin;
  txt_Title.Text = Title;
  txt_cardnum.Text = CardNum;
}

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