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",这意味着它们有资格插入。
您也不需要所有那些 Close
和 Dispose
调用;这就是 Using
语句的要点 - 它会为您做到这一点。使用 DbDataAdapter
,您可以跳过创建 Connection
和 Command
对象,并让它从构造函数中传递给它的 SQL 和 ConnectionString 创建自己的对象。
我也跳过了 DataSet
,因为它只有一个 table。
我正在尝试通过 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",这意味着它们有资格插入。
您也不需要所有那些 Close
和 Dispose
调用;这就是 Using
语句的要点 - 它会为您做到这一点。使用 DbDataAdapter
,您可以跳过创建 Connection
和 Command
对象,并让它从构造函数中传递给它的 SQL 和 ConnectionString 创建自己的对象。
我也跳过了 DataSet
,因为它只有一个 table。