2017-02-06 19 views
1

OleDb接続を使用しているデータベースからVB.netを介してデータを取得し、データセットを取得してSQLiteデータベースに直接格納しようとしています。私が抱えている問題は、最初のデータベースからデータを取得することですが、Updateコマンドを実行した後、SQLiteデータベースを見ると、ゼロレコードで空になります。彼らは両方とも同じディレクトリに2つの異なるデータベースを指しています。私はexecptionsを取得しませんが、何も新しいSQLiteデータベースに取り込まれることはありません。それを引き起こす可能性のあることに対する示唆はありますか?OleDBデータベースから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 

答えて

2

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を設定しないアダプタに指示します。デバッグ行は状態を「追加済み」としてレポートします。つまり、挿入が可能です。

また、CloseDisposeコールはすべて必要ではありません。それはUsingの声明のポイントです - あなたのためにそれを行います。 DbDataAdapterを使用すると、ConnectionオブジェクトとCommandオブジェクトを作成せずに、コンストラクタで渡されたSQLとConnectionStringからオブジェクトを作成できるようになります。

DataSetは1つのテーブルなので、私もスキップしました。

+0

恐ろしいプルトニック。偶然、このアプローチが各行を読み込み、挿入コマンドを実行することと比較してどれだけ高速かを知っていますか?これは、バルク挿入ではなく、一度に1行ずつデータベースサイズが少しずつ増加することに基づいています。 –

+0

私はパフォーマンスについてはわかりませんが、バルクは関係ありません。 DAの魔法は、変更された行数に必要なすべてのINSERT、DELETE、およびUPDATESを実行でき、少し遅くなる可能性があることです。これは1つの操作だけが存在するため、非常に速くなければなりません。 MSDNはプロセスの順序を説明します – Plutonix

関連する問題