База данных OleDB в базу данных SQLite

Я пытаюсь получить данные из базы данных, которая использует соединение OleDb через VB.net, беру набор данных и пытаюсь поместить его прямо в базу данных sqlite. Проблема, с которой я сталкиваюсь, заключается в том, что я получаю данные из первой базы данных, но после того, как я выполняю команду «Обновить» и смотрю на базу данных SQLite, она пуста с нулевыми записями. Оба они указывают на две разные базы данных в одном каталоге. Я не получаю исключений, но в новую базу данных SQLite ничего не заносится. Любые предложения о том, что может быть причиной этого?

Dim ds As New DataSet 
Dim SQL As String = "SELECT * FROM SOMETABLE"
Using conn As New OleDBConnection("Provider=Microsoft.Jet.OLEDB.4.0;Mode=Share Deny None;Data Source=Data.mdb;Jet OLEDB:Engine Type=5"
      conn.Open()
      Using com As New OleDbCommand(SQL, conn)
            Using da As OleDBDataAdapter = New OleDBDataAdapter(conn)
                  da.Fill(ds, "Employees")
                  da.Dispose()
            End Using
            com.Dispose()
      End Using
      conn.Close()
End Using

Using conn As New SqliteConnection("Data Source=Data.db;Version=3;"
      conn.Open()
      Using com As New SqliteCommand(SQL, conn)
            Using da As SqliteDataAdapter = New SqliteDataAdapter(conn)
                  Using cmdBuilder As New SQLiteCommandBuilder(da)
                        da.TableMappings.Add("SOMETABLE", "SOMETABLE")
                        da.InsertCommand = cmdBuilder.GetInsertCommand()
                        da.Update(ds, "SOMETABLE")
                  End Using
                  da.Dispose()
            End Using
            com.Dispose()
      End Using
      conn.Close()
End Using

person DotNet Programmer    schedule 06.02.2017    source источник


Ответы (1)


Имейте в виду, что каждая строка в DataTable включает свойство для отслеживания ее состояния — является ли она новой, измененной или удаленной. Когда вы впервые читаете данные, это состояние будет unchanged, если вы не скажете иначе. Это также можно сделать с помощью немного меньшего количества кода:

Dim SQL As String = "SELECT Id, Name, ... ItemDate, Active FROM SampleY"

Dim dt As New DataTable
Using da As New OleDbDataAdapter(SQL, ACEConnStr)
    ' tell it not to set rows to Unchanged
    da.AcceptChangesDuringFill = False
    da.Fill(dt)
End Using

' for demo purposes
Console.WriteLine("Rows: {0}", dt.Rows.Count)
Console.WriteLine("State: {0}", dt.Rows(0).RowState)

Using da As New SQLiteDataAdapter(SQL, LiteConnStr)
    Dim cb As New SQLiteCommandBuilder(da)
    da.InsertCommand = cb.GetInsertCommand

    Dim rows = da.Update(dt)
End Using

da.AcceptChangesDuringFill = False указывает адаптеру не устанавливать RowState в строках при загрузке. Строка отладки сообщит о состояниях как «Добавлено», что означает, что они могут быть вставлены.

Вам также не нужны все эти вызовы Close и Dispose; в этом смысл оператора Using — он делает это за вас. Используя DbDataAdapter, вы можете пропустить создание объектов Connection и Command и позволить ему создать свой собственный из SQL и ConnectionString, переданных ему в конструкторе.

Я также пропустил DataSet, так как это всего лишь одна таблица.

person Ňɏssa Pøngjǣrdenlarp    schedule 06.02.2017
comment
Шикарный Плутоникс. Вы случайно не знаете, насколько быстрее этот подход по сравнению с чтением каждой строки и выполнением команды вставки? Это появляется на основе того, как он постепенно увеличивается в размере базы данных, он выполняет одну строку за раз вместо массовой вставки. - person DotNet Programmer; 07.02.2017
comment
Я не уверен в производительности, но никакого набора массы не происходит. Магия DA заключается в том, что он может выполнять все операции INSERT, DELETE и UPDATE, необходимые для любого количества измененных строк, что может быть немного медленным. ЭТО должно быть прилично быстро, потому что будет только одна операция. MSDN объясняет порядок процесса - person Ňɏssa Pøngjǣrdenlarp; 07.02.2017