2017-02-06 4 views
1

Ich versuche, die Daten aus einer Datenbank, die OleDb-Verbindung über VB.net verwendet, zu nehmen und den Datensatz zu nehmen und direkt in eine SQLite-Datenbank zu bringen. Das Problem, das ich habe, ist, dass ich die Daten aus der ersten Datenbank bekomme, aber nachdem ich den Update-Befehl gemacht habe und ich auf die SQLite-Datenbank schaue, ist sie leer mit null Datensätzen. Beide verweisen auf zwei verschiedene Datenbanken im selben Verzeichnis. Ich bekomme keine Ausnahmen, aber nichts wird in die neue SQLite-Datenbank eingefügt. Irgendwelche Vorschläge zu was könnte das verursachen?OleDB-Datenbank in SQLite-Datenbank

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 

Antwort

2

Beachten Sie, dass jede Zeile in den DataTable eine Eigenschaft enthält seinen Zustand zu verfolgen - ob es neu ist, geändert oder gelöscht werden. Wenn Sie zuerst die Daten einlesen, wird dieser Zustand unchanged sein, es sei denn, Sie sagen es anders. Es kann auch mit etwas weniger Code erfolgen:

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 den Adapter erzählt die RowState auf die Zeilen nicht zu setzen, wenn das Laden. Die Debug-Zeile meldet die Status als "Hinzugefügt", was bedeutet, dass sie zum Einfügen berechtigt sind.

Sie brauchen auch nicht alle diese Close und Dispose Anrufe; das ist der Punkt der Using Aussage - es tut das für Sie. Mit einem DbDataAdapter können Sie überspringen Connection und Command Objekte erstellen und lassen Sie es eine eigene aus der SQL und ConnectionString erstellen, die im Konstruktor übergeben.

Ich übersprang auch die DataSet, da es nur eine Tabelle ist.

+0

Awesome Plutonix. Sie wissen zufällig, wie viel schneller dieser Ansatz verglichen wird mit dem Lesen jeder Zeile und dem Einfügen eines Befehls? Es scheint, basierend darauf, wie es nach und nach in der Datenbankgröße zunimmt, die es Zeile für Zeile anstelle einer Masseneinfügung ausführt. –

+0

Ich bin mir nicht sicher über die Leistung, aber es gibt keine Massenbildung beteiligt. Die Magie der DA ist, dass sie alle INSERT-, DELETE- und UPDATES-Operationen ausführen kann, die für eine beliebige Anzahl von geänderten Zeilen benötigt werden, was ein wenig langsam sein kann. Das sollte anständig schnell sein, denn es wird immer nur eine Operation geben. MSDN erläutert die Reihenfolge des Prozesses – Plutonix