RC4 CopyDatabase

18/12/2011 - 14:55 von W. Wolf | Report spam
Hallo,

ich möchte eine SQLite DB wie ein Standard-File verwenden,
also Anlegen, Speichern und spàter wieder öffnen und nach
eventuellen Änderungen erneut speichern oder die Änderungen
verwerfen:

1. Neu: .CreateNewDB ":memory:"
2. Speichern unter: sCnn.CopyDatabase Filename
3. Öffnen: OpenDB Filename und CopyDatabase ":memory:"
4. Speichern sCnn.CopyDatabase Filename

1 und 2 kein Problem
3 und 4 geht nicht, bzw. da mache ich wohl was falsch, weil
Filename im Zugriff bleibt. Was ich möchte, ist die DB in den
Speicher zu lesen, danach die Connection zur DB wieder trennen
in nur noch InMemory arbeiten.

Hier der Code der so nicht funktioniert:

Public Sub OpenFile(Filename As String, sCnn as cConnection)
Dim newCnn As cConnection
Set newCnn = New_c.Connection
newCnn.OpenDB Filename
newCnn.CopyDatabase ":memory:"
newCnn.Filename = ":memory:"
Set sCnn = newCnn
End Sub

Public Sub SaveFile(Filename As String, sCnn as cConnection)
If New_c.FSO.FileExists(Filename) Then Kill Filename 'das geht nicht!
sCnn.CopyDatabase Filename 'das funktioniert nur mit neuem Filename
End Sub

Schönen Gruß
W. Wolf
 

Lesen sie die antworten

#1 Schmidt
19/12/2011 - 19:16 | Warnen spam
Am 18.12.2011 14:55, schrieb W. Wolf:

ich möchte eine SQLite DB wie ein Standard-File verwenden,
also Anlegen, Speichern und spàter wieder öffnen und nach
eventuellen Änderungen erneut speichern oder die Änderungen
verwerfen:

1. Neu: .CreateNewDB ":memory:"
2. Speichern unter: sCnn.CopyDatabase Filename
3. Öffnen: OpenDB Filename und CopyDatabase ":memory:"
4. Speichern sCnn.CopyDatabase Filename

1 und 2 kein Problem
3 und 4 geht nicht, bzw. da mache ich wohl was falsch,



Yep, die CopyDataBase-Methode gibt die neue
DB-Connection zurück - dh. wenn von einer
(temporàr kurz geöffneten) FileDB eine InMemory-
Kopie gezogen werden soll (zum Weiterarbeiten
und Hinzufügen von neuen Daten "im Speicher"),
dann wàre das hier eine Variante z.B.:

Private Function OpenFileDBInMemory(FileName As String) As cConnection
'create a temporary FileDB-Connection
With New_c.Connection(DBFolder & FileName, DBOpenFromFile)
Set OpenFileDBInMemory = .CopyDatabase(":memory:")
End With
End Function


Hier nochmal ein kleines, vollstàndigeres Beispiel,
mit einer dynamisch (im User-AppData\local-Folder)
erzeugten FileListe (zwei unterschiedliche DBs).

'***In eine Form (dann auf FileList-EIntràge clicken)
Option Explicit

Private New_c As New cConstructor
Private DBFolder As String, MemCnn As cConnection

Private WithEvents FileList As FileListBox


Private Sub Form_Load()
Caption = "Click the FileList, to open FileDBs InMemory"

'create a writable DBFolder in the Users local AppData
On Error Resume Next
DBFolder = New_c.FSO.GetLocalAppDataPath & "\MyDBs\"
MkDir DBFolder
On Error GoTo 0

'create a FileList-Control dynamically, to show the current DBs
ScaleMode = vbPixels
Set FileList = Controls.Add("VB.FileListBox", "FileList")
FileList.Path = DBFolder
FileList.Move 3, 3, 200, 200
FileList.Visible = True

'now the DB-Test-Routines
DBTest
End Sub

Private Sub DBTest()
Debug.Print "DB-Creation"

'start with a new DB, created in Memory (including Schema-Construction)
Set MemCnn = CreateNewDB()


AddNewRecord 'just a write-test (put some new data into Table 'T')
DumpLastRecord 'check for the last written content in Table 'T'

'now we copy the current (just changed) MemDB-Content to a File
SaveInMemDBToFile "DBFileWith_1_Record.db3"


'same thing again (add an additional Record + Save to a different File)

AddNewRecord 'just a write-test (put some new data into Table 'T')
DumpLastRecord 'check for the last written content in Table 'T'

'now we copy the current (just changed) MemDB-Content to a File
SaveInMemDBToFile "DBFileWith_2_Records.db3"
End Sub

Private Sub FileList_Click()
Debug.Print "FileOpen (into Memory) of : " & FileList.FileName
Set MemCnn = OpenFileDBInMemory(FileList.FileName)
DumpLastRecord
End Sub

Private Function CreateNewDB() As cConnection
'create InMemory-DB-Connection
Set CreateNewDB = New_c.Connection(, DBCreateInMemory)

'create the DB-Schema dynamically on our new cConnection
CreateNewDB.Execute "Create Table T(ID Integer Primary Key,Txt Text)"
End Function

Private Function SaveInMemDBToFile(FileName As String)
On Error Resume Next
Kill DBFolder & FileName
On Error GoTo 0
MemCnn.CopyDatabase DBFolder & FileName
FileList.Refresh
End Function

Private Function OpenFileDBInMemory(FileName As String) As cConnection
'create a temporary FileDB-Connection
With New_c.Connection(DBFolder & FileName, DBOpenFromFile)
Set OpenFileDBInMemory = .CopyDatabase(":memory:")
End With
End Function

Private Sub AddNewRecord()
With MemCnn.OpenRecordset("Select * From T Where 0")
.AddNew
.Fields("Txt").Value = "New Record " & Timer
.UpdateBatch
End With
End Sub

Private Sub DumpLastRecord()
With MemCnn.OpenRecordset("Select * From T")
Debug.Print "Records in Table T: "; .RecordCount

.MoveLast
Debug.Print " Col-Values of last Record: ", !ID.Value, !Txt.Value
End With
Debug.Print
End Sub

Olaf

Ähnliche fragen