vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Sch?tzen Sie Ihre Software vor Software-Piraterie - mit sevLock 1.0 DLL!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Newsletter  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2019
 
zurück
Rubrik: Datenbanken · Sonstiges   |   VB-Versionen: VB4, VB5, VB606.10.03
Importspezifikation einer DB in VB erstellen

Textdateien in eine DB importieren nach Importspezifikation - und alles programmiert in VB!

Autor:   Benedikt MandtBewertung:     [ Jetzt bewerten ]Views:  37.634 
ohne HomepageSystem:  Win9x, WinNT, Win2k, WinXP, Vista, Win7, Win8, Win10 Beispielprojekt auf CD 

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 37.634 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!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.
 
   

Druckansicht Druckansicht Copyright ©2000-2019 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
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.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel