IamLance1578 Ответов: 2

Ошибка при вставке sqlite DATETIME в VB.NET


Пример данных, вставляемых в базу данных SQLite db (файл.dat)
41 2017-09-07 17:01:09 1   1   1   0
      27   2017-09-07 17:01:13 1   1   1   0
      42   2017-09-07 17:01:31 1   1   1   0
      46   2017-09-07 17:04:05 1   1   1   0
      44   2017-09-07 17:04:12 1   1   1   0
      45   2017-09-07 17:04:16 1   1   1   0
      47   2017-09-07 17:05:09 1   1   1   0
      17   2017-09-07 17:05:19 1   1   1   0
      29   2017-09-07 17:05:47 1   1   1   0
      35   2017-09-07 17:09:14 1   1   1   0
       8   2017-09-07 17:09:22 1   1   1   0

Это мой стол.
TABLE "tblTempData" ( `fldMacId` INTEGER, `fldDateTime` TEXT, `fldRem1` TEXT, `fldRem2` TEXT, `fldRem3` TEXT, `fldRem4` TEXT )


Это моя петля
Dim InsertData As String = "INSERT INTO tblTempData (fldMacId,fldDateTime,fldRem1,fldRem2,fldRem3,fldRem4) Values (@MacId,@xDateTime,@Rem1,@Rem2,@Rem3,@Rem4)"
Do
                sLine = Filereader.ReadLine
                If sLine Is Nothing Then Exit Do
                Dim vArray() As String = sLine.Split(CType(vbTab, Char()))
                Dim cmd As New SQLiteCommand(InsertData, MyConn)
                cmd.Parameters.Add("@MacId", CInt(vArray(0)))
                cmd.Parameters.Add("@xDateTime", CStr(vArray(1))) <- This cause an error
                cmd.Parameters.Add("@Rem1", CStr(vArray(2)))
                cmd.Parameters.Add("@Rem2", CStr(vArray(3)))
                cmd.Parameters.Add("@Rem3", CStr(vArray(4)))
                cmd.Parameters.Add("@Rem4", CStr(vArray(5)))
                cmd.ExecuteNonQuery()
                MsgBox(InsertData)
            Loop

Это и есть ошибка
Conversion from string "9/7/2017 5:01:09 PM" to type 'Integer' is not valid.


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

Я пробую этот код, но безуспешно
cmd.Parameters.Add("@xDateTime", FormatDateTime(vArray(1), DateFormat.GeneralDate))

2 Ответов

Рейтинг:
9

IamLance1578

Я обнаружил ошибку.
SQLite принимает данные в следующем формате

41,"2017-09-07 17:01:09",1,1,1,0

Поэтому я внес изменения в код INSERT INTO
<pre>strSQL = "INSERT INTO tblTempData (fldMacId,fldDateTime,fldRem1,fldRem2,fldRem3,fldRem4) Values " &
                    "(" & CInt(vArray(0)) &
                    ",'" & CStr(vArray(1)) &
                    "','" & CStr(vArray(2)) &
                    "','" & CStr(vArray(3)) &
                    "','" & CStr(vArray(4)) &
                    "','" & CStr(vArray(5)) & "')"



и это работает...


Dave Kreskowiak

Да, опять же, еще одна очень плохая привычка. Вы сохраняете значения даты и времени в виде строк в своей базе данных. Это неправильно. Он должен храниться в столбце даты/времени в базе данных, а не в виде строки.

IamLance1578

@Дэйв Kreskowiak

Да, вы правы, если я использую ms access или MySQL, я буду использовать тип даты в качестве даты, однако я использую SQLite. Насколько я знаю, в SQLite нет типов дат. У него есть только NULL. Целочисленные, вещественные, текстовые и BLOB-объекты. SQLite может хранить даты и время в виде текста, реального или целого числа, как указано в https://www.sqlite.org/datatype3.html если только я не ошибаюсь :-)

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

Рейтинг:
2

Graeme_Grant

Вы должны использовать DATETIME вместо TEXT Теперь вам не нужно назначать дату.

Другое дело, при работе с датами и временем, использовать универсальное координированное время (UTC). Таким образом, если приложение используется в другом часовом поясе, дата и время будут правильными. Для этого добавьте ;DateTimeKind=Utc к строке подключения.