Es soll eine Textdatei in eine Datenbank importiert werden. Eigentlich ganz einfach: Datenbank per Hand erstellen, dazu noch eine schöne Importspezifikation, und dann die Textdatei in Access importieren. Was aber, wenn die Datenbank nicht mitgeliefert, sondern in VB erstellt werden soll? Der folgende Tipp legt eine Access-Datenbank neu an, erstellt eine Importspezifikation und importiert dann eine Textdatei in die Datenbank. Alles mit VB, die Datenbank braucht also nicht mitgeliefert zu werden. Getestet wurde das Projekt im übrigen unter Access 97. Für den Import muß Access auch auf dem Rechner installiert sein. Grundlage ist folgende Erkenntnis: legt man eine Importspezifikation in einer DB an, werden automatisch 2 Tabellen erstellt: MSysIMEXSpecs und MSysIMEXColumns. In der Specs-Tabelle werden Einstellungen wie Spezifikationsname, Trennzeichen, Einstellungen für das Datumsformat usw. gespeichert, in der Columns-Tabelle die einzelnen Feldnamen und Felddatentypen, die man in der Spezifikation definiert hat. Über eine Nummer werden die Felder dann der Spezifikation zugeordnet, falls man mehrere anlegen möchte. Diese Tabellen erzeugen wir einfach per Code und fügen die Datensätze hinzu. Die hier hinzugefügten Datensätze können sich jedoch von den Datensätzen Ihrer Spezifikation unterscheiden! Deshalb würde ich empfehlen, die Spezifikation zunächst aus Access heraus anzulegen und den Code entsprechend abzuändern. Zunächst benötigen wir einen Verweis auf die DAO-Object-Library 3.51 (Access97) bzw DAO 3.6 für Access 2000/XP-Unterstützung. Importspezifikation erstellen ' Importspezifikation einer DB in VB erstellen Private Sub Spezifikation_Erstellen(ByVal sDBFile As String) Dim oDB As DAO.Database Dim oRs As DAO.Recordset Dim tbdMSysIMEXSpecs As DAO.TableDef Dim tbdMSysIMEXColumns As DAO.TableDef Dim oIndex As DAO.Index Dim oField As DAO.Field Dim i As Integer ' Datenbank wird erstellt Set oDB = DBEngine.Workspaces(0).CreateDatabase(sDBFile, dbLangGeneral) ' Systemtabellen werden erstellt Set tbdMSysIMEXSpecs = oDB.CreateTableDef("MSysIMEXSpecs", dbSystemObject) Set tbdMSysIMEXColumns = oDB.CreateTableDef("MSysIMEXColumns", dbSystemObject) ' Felder der Systemtabelle "MSysIMEXSpecs" werden erstellt db_CreateField tbdMSysIMEXSpecs, "DateDelim", dbText db_CreateField tbdMSysIMEXSpecs, "DateFourDigitYear", dbBoolean db_CreateField tbdMSysIMEXSpecs, "DateLeadingZeros", dbBoolean db_CreateField tbdMSysIMEXSpecs, "DateOrder", dbInteger db_CreateField tbdMSysIMEXSpecs, "DecimalPoint", dbText db_CreateField tbdMSysIMEXSpecs, "FieldSeparator", dbText db_CreateField tbdMSysIMEXSpecs, "FileType", dbInteger db_CreateField tbdMSysIMEXSpecs, "SpecID", dbLong db_CreateField tbdMSysIMEXSpecs, "SpecName", dbText db_CreateField tbdMSysIMEXSpecs, "SpecType", dbByte db_CreateField tbdMSysIMEXSpecs, "StartRow", dbLong db_CreateField tbdMSysIMEXSpecs, "TextDelim", dbText db_CreateField tbdMSysIMEXSpecs, "TimeDelim", dbText ' Felder der Systemtabelle "MSysIMEXColumns" werden erstellt db_CreateField tbdMSysIMEXColumns, "Attributes", dbLong db_CreateField tbdMSysIMEXColumns, "DataType", dbInteger db_CreateField tbdMSysIMEXColumns, "FieldName", dbText db_CreateField tbdMSysIMEXColumns, "IndexType", dbByte db_CreateField tbdMSysIMEXColumns, "SkipColumn", dbBoolean db_CreateField tbdMSysIMEXColumns, "SpecID", dbLong db_CreateField tbdMSysIMEXColumns, "Start", dbInteger db_CreateField tbdMSysIMEXColumns, "Width", dbInteger ' Tabellen werden der Datenbank zugeordnet oDB.TableDefs.Append tbdMSysIMEXSpecs oDB.TableDefs.Append tbdMSysIMEXColumns ' Schlüssel für Tab MSysIMEXSpecs werden gesetzt Set tbdMSysIMEXSpecs = oDB.TableDefs("MSysIMEXSpecs") Set oIndex = tbdMSysIMEXSpecs.CreateIndex("PrimaryKey") With oIndex .Primary = True .Unique = True Set oField = .CreateField("SpecName") .Fields.Append oField End With tbdMSysIMEXSpecs.Indexes.Append oIndex Set oField = Nothing Set oIndex = Nothing ' Schlüssel für Tab MSysIMEXColumns werden gesetzt Set tbdMSysIMEXColumns = oDB.TableDefs("MSysIMEXColumns") Set oIndex = tbdMSysIMEXColumns.CreateIndex("Index1") With oIndex .Primary = False .Unique = False Set oField = .CreateField("SpecID") .Fields.Append oField Set oField = Nothing Set oField = .CreateField("Start") .Fields.Append oField End With tbdMSysIMEXColumns.Indexes.Append oIndex Set oIndex = Nothing Set oIndex = tbdMSysIMEXColumns.CreateIndex("PrimaryKey") With oIndex .Primary = True .Unique = True Set oField = .CreateField("SpecID") .Fields.Append oField Set oField = Nothing Set oField = .CreateField("FieldName") .Fields.Append oField End With tbdMSysIMEXColumns.Indexes.Append oIndex ' Datenbank wird geschlossen oDB.Close ' Tabelle MSysIMEXSpecs wird mit Werten gefüllt Set oDB = DBEngine.Workspaces(0).OpenDatabase(sDBFile) Set oRs = oDB.OpenRecordset("MSysIMEXSpecs") oRs.AddNew ' Achtung: Daten der Felder sind je nach gewünschten ' Einstellungen unterschiedlich; am besten per Hand ' anlegen und nachprüfen oRs!DateDelim = "." oRs!DateFourDigitYear = 0 oRs!DateLeadingZeros = 0 oRs!DateOrder = 0 oRs!DecimalPoint = "," oRs!FieldSeparator = ";" oRs!FileType = 1 oRs!SpecID = 1 oRs!SpecName = "Spezifikationsname" oRs!SpecType = 1 oRs!StartRow = 0 oRs!TextDelim = Null oRs!TimeDelim = ":" oRs.Update oRs.Close Set oRs = Nothing ' Tabelle MSysIMEXColumns wird mit Werten gefüllt Set oRs = oDB.OpenRecordset("MSysIMEXColumns") For i = 1 To 2 ' oder je nachdem, wie viele Felder die künftige Tabelle haben soll oRs.AddNew oRs!Attributes = 0 oRs!DataType = 10 ' 10 ist Nur-Text; auch hier kann es Unterschiede geben oRs!FieldName = "Feld" & CStr(i) oRs!IndexType = 0 oRs!SkipColumn = 0 oRs!SpecID = 1 oRs!Start = i ' wichtig, damit die Reihenfolge der Felder erhalten bleibt oRs!Width = 0 oRs.Update Next i oRs.Close Set oRs = Nothing ' Datenbank schließen oDB.Close Set oDB = Nothing End Sub ' Feld in Tabellendefinition erstellen Private Sub db_CreateField(oTableDef As DAO.TableDef, _ ByVal sFieldname As String, ByVal nFieldType As Integer) Dim oField As DAO.Field Set oField = oTableDef.CreateField(sFieldname, nFieldType) oTableDef.Fields.Append oField End Sub Text-Datei importieren Der eigentliche Import ist ziemlich unspektakulär: Public Function Textdatei_Importieren(ByVal sDBFile As String, _ ByVal sTextFile As String) ' Access-Objekt erzeugen und auf DB setzen Dim oAccess As Object Set oAccess = CreateObject("Access.application") With oAccess .Visible = False .OpenCurrentDatabase (sDBFile) ' Textdatei wird in die Datenbank importiert .DoCmd.TransferText 0, "Spezifikationsname", "test", sTxtFile .Quit End With Set oAccess = Nothing End Function Die beiden Funktionen werden dann in einer Form aufgerufen, z.B. so: Private Sub Form_Load() Spezifikation_Erstellen "c:\test.mdb" Textdatei_Importieren "c:\test.mdb", "d:\test.txt" End Sub Und fertig! Mit entsprechender Codeänderung lassen sich natürlich auch Datein exportieren. Auch Excel-Tabellen oder andere Datenbanken lassen sich im- bzw. exportieren. Dieser Tipp wurde bereits 43.991 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
sevISDN 1.0 Überwachung aller eingehender Anrufe! Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Tipp des Monats März 2024 Dieter Otter UTF-8 Konvertierung von Dateien und Strings VB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. Neu! sevCoolbar 3.0 Professionelle Toolbars im modernen Design! Mit sevCoolbar erstellen Sie in wenigen Minuten ansprechende und moderne Toolbars und passen diese optimal an das Layout Ihrer Anwendung an (inkl. große Symbolbibliothek) - für VB und MS-Access |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |