IamLance1578 Ответов: 1

Как я могу импортировать?dat-файл в VB, net с использованием sqlite


Я использую этот код для импорта .dat файл в таблицу SQLite
Мое соединение
Public strConn As String = "Data Source =DTS.db;Version=3;"

Моя Процедура
 Private Sub btnImportDB_Click(sender As Object, e As EventArgs) Handles btnImportDB.Click

        If txtDatFile.Text = String.Empty Then Exit Sub

        Dim fname As String = txtDatFile.Text
        Dim colsexpected As Integer = 6
        Dim Filereader As New StreamReader(fname, Encoding.Default)
        Dim sLine As String = String.Empty

        Using MyConn As New SQLiteConnection(strConn)
            Do
                sLine = Filereader.ReadLine
                If sLine Is Nothing Then Exit Do
                Dim vArray() As String = sLine.Split(CType(vbTab, Char()))
                'Save data to table
                Dim InsertData As String = "INSERT INTO tblTempData (fldMacId,fldDateTime,fldRem1,fldRem2,fldRem3,fldRem4) Values (@MacId,@xDateTime,@Rem1,@Rem2,@Rem3,@Rem4)"
                Dim cmd As New SQLiteCommand(InsertData, MyConn)
                cmd.Parameters.AddWithValue("@MacId", vArray(0))
                cmd.Parameters.AddWithValue("@xDateTime", vArray(1))
                cmd.Parameters.AddWithValue("@Rem1", vArray(2))
                cmd.Parameters.AddWithValue("@Rem2", vArray(3))
                cmd.Parameters.AddWithValue("@Rem3", vArray(4))
                cmd.Parameters.AddWithValue("@Rem4", vArray(5))
                Try
                    With MyConn
                        If .State = ConnectionState.Open Then .Close()
                        .ConnectionString = strConn
                        .Open()
                        MyConn.Open()
                        cmd.ExecuteNonQuery()
                        Cursor.Current = Cursors.WaitCursor
                        'MsgBox("Connection is  Open")
                    End With
                Catch ex As Exception
                    MessageBox.Show(ex.Message)
                End Try

            Loop
        End Using
        MessageBox.Show("Records successfully imported.", "Save", MessageBoxButtons.OK, MessageBoxIcon.Information)
        txtDatFile.Clear()
End Sub


Это и есть ошибка
{"Operation is not valid due to the current state of the object."}


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

Я не могу найти, какая часть вызывает ошибку..

Mehdi Gholam

Какой формат у вашего файла .dat (dat-это общее расширение, поэтому какое приложение его создало)?

Richard MacCutchan

Вы вызываете Open() дважды.

IamLance1578

@Мехди Голам
Это формат файла .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
8 2017-09-07 17:09:28 1 1 1 0
11 2017-09-07 17:10:49 1 1 1 0
10 2017-09-07 17:13:17 1 1 1 0
33 2017-09-07 17:13:44 1 1 1 0
30 2017-09-07 17:13:56 1 1 1 0

@Ричард MacCutchan
Если я это сделаю то получу ту же ошибку

Private Sub btnImportDB_Click(sender As Object, e As EventArgs) Handles btnImportDB.Click

       If txtDatFile.Text = String.Empty Then Exit Sub

       Dim fname As String = txtDatFile.Text
       Dim colsexpected As Integer = 6
       Dim Filereader As New StreamReader(fname, Encoding.Default)
       Dim sLine As String = String.Empty

       Using MyConn As New SQLiteConnection(strConn)
           Do
               sLine = Filereader.ReadLine
               If sLine Is Nothing Then Exit Do
               Dim vArray() As String = sLine.Split(CType(vbTab, Char()))
               'Save data to table
               Dim InsertData As String = "INSERT INTO tblTempData (fldMacId,fldDateTime,fldRem1,fldRem2,fldRem3,fldRem4) Values (@MacId,@xDateTime,@Rem1,@Rem2,@Rem3,@Rem4)"
               Dim cmd As New SQLiteCommand(InsertData, MyConn)
               cmd.Parameters.AddWithValue("@MacId", vArray(0))
               cmd.Parameters.AddWithValue("@xDateTime", vArray(1))
               cmd.Parameters.AddWithValue("@Rem1", vArray(2))
               cmd.Parameters.AddWithValue("@Rem2", vArray(3))
               cmd.Parameters.AddWithValue("@Rem3", vArray(4))
               cmd.Parameters.AddWithValue("@Rem4", vArray(5))

               MyConn.Open()
               cmd.ExecuteNonQuery()

           Loop
       End Using
       MessageBox.Show("Records successfully imported.", "Save", MessageBoxButtons.OK, MessageBoxIcon.Information)
       txtDatFile.Clear()
   End Sub

1 Ответов

Рейтинг:
8

Dave Kreskowiak

Перемещения .Открытый вызов из цикла. Вам нужно только вызвать его один раз, прежде чем вы начнете цикл.

Кроме того, переместите код для создания объекта SQLiteCommand и его параметров из цикла. Создайте его один раз и повторно используйте! Не используйте .AddWithValue, use .Добавьте вместо этого и просто опишите параметр.

Внутри цикла вы устанавливаете значения ваших объектов параметров.


IamLance1578

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

Private Sub btnImportDB_Click(sender As Object, e As EventArgs) Handles btnImportDB.Click

        If txtDatFile.Text = String.Empty Then Exit Sub

        Dim fname As String = txtDatFile.Text
        Dim colsexpected As Integer = 6
        Dim Filereader As New StreamReader(fname, Encoding.Default)
        Dim sLine As String = String.Empty

        Using MyConn As New SQLiteConnection(strConn)
            MyConn.Open()
            'Save data to table
            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", FormatDateTime(vArray(1), DateFormat.GeneralDate))
                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
        End Using
        MessageBox.Show("Records successfully imported.", "Save", MessageBoxButtons.OK, MessageBoxIcon.Information)
        txtDatFile.Clear()
    End Sub

Dave Kreskowiak

О, я знаю, что это работает. Это просто то, что я бы ни в малейшей степени не рассматривал как код "качества производства". Вы создаете тонну объектов, которые вам не нужно создавать для каждой импортируемой записи, ограничивая масштабируемость вашего кода и без необходимости замедляя его с помощью все большего и большего количества выделений. Вы также создаете тонну дополнительной работы для сборщика мусора, чтобы вернуть все эти блоки памяти обратно в управляемую кучу и, возможно, создать фрагментированную среду памяти.

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

IamLance1578

@Дэйв Kreskowiak
Большое вам спасибо за Ваш вклад. Я на самом деле не профессионал. Я просто пытаюсь создать программу, которая может быть использована школами здесь, у меня дома, бесплатно. :-)
У меня все еще есть проблемы в коде, который выдает ошибку при вставке datetime. Однако я задал ему еще один вопрос.
Я знаю, что мое кодирование отстой :-)
Не могли бы вы объяснить мне это

you don't need to create PER RECORD YOU IMPORT 


У вас есть какие-нибудь идеи, как улучшить мой код?

Dave Kreskowiak

Я уже говорил тебе. Перечитайте мой пост.