OleDB 数据库到 SQLite 数据库

OleDB database to SQLite database

我正在尝试通过 VB.net 从使用 OleDb 连接的数据库中获取数据,然后获取数据集并尝试将其直接放入 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

请记住,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。调试行会将状态报告为 "Added",这意味着它们有资格插入。

您也不需要所有那些 CloseDispose 调用;这就是 Using 语句的要点 - 它会为您做到这一点。使用 DbDataAdapter,您可以跳过创建 ConnectionCommand 对象,并让它从构造函数中传递给它的 SQL 和 ConnectionString 创建自己的对象。

我也跳过了 DataSet,因为它只有一个 table。