Frage

Ich möchte den Inhalt von mehreren Tabellen von MSAccess2003 exportieren. Die Tabellen enthalten Unicode japanische Schriftzeichen. Ich möchte, dass sie als Tilde getrennte Dateien Text speichern.

Ich kann diese manuell mit Datei / Export und in Dialogauswahl Tilde als Feldtrennzeichen ‚Erweitert‘ und der Unicode als Codepage aus.

Ich kann speichern dies als Export-Spezifikation, aber dies scheint Tabelle spezifisch zu sein.

Ich mag viele Tabellen mit VBA-Code.

Export

Bisher habe ich versucht:

Unter ExportTables ()

Dim lTbl As Long
Dim dBase As Database
Dim TableName As String

Set dBase = CurrentDb

For lTbl = 0 To dBase.TableDefs.Count
     'If the table name is a temporary or system table then ignore it
    If Left(dBase.TableDefs(lTbl).Name, 1) = "~" Or _
    Left(dBase.TableDefs(lTbl).Name, 4) = "MSYS" Then
         '~ indicates a temporary table
         'MSYS indicates a system level table
    Else
      TableName = dBase.TableDefs(lTbl).Name
      DoCmd.TransferText acExportDelim, "UnicodeTilde", TableName, "c:\" + TableName + ".txt", True
    End If
Next lTbl
Set dBase = Nothing

End Sub

Als ich das laufen erhalte ich eine Ausnahme:

Laufzeitfehler '3011': Das Microsoft Jet-Datenbank-Engine das Objekt nicht finden konnte „Allowance1 # txt‘. Stellen Sie sicher, dass das Objekt vorhanden ist, und dass Sie buchstabieren seinen Namen und den Pfadnamen richtig.

Wenn ich an dieser Stelle debuggen, Tablename ist 'Allowance1', wie erwartet.

Ich denke, meine UnicodeTilde Exportspezifikationstabelle spezifisch ist, so kann ich es nicht für mehrere Tabellen verwenden.

Was ist die Lösung? Soll ich etwas anderes verwenden, andere als Transfer, oder vielleicht die Exportspezifikation programmatisch erstellen?

Jede Hilfe sehr geschätzt.

War es hilfreich?

Lösung

Ich habe schließlich löste dies. (Ich bin jetzt mit Access 2007 hatte aber die gleichen Probleme wie mit Access 2003).

Erstens, was nicht funktioniert hat:

Transfer würde nur die Kopfzeile Unicode machen und Tilde begrenzt, auch mit einem korrekt formatiert schema.ini. (Nein, ich habe es nicht setze alle auf einer Linie, das war nur ein Formatierungs Problem mit der HTML-Datei auf Stackoverflow.)

[MyTable.txt]
CharacterSet = Unicode
Format = Delimited(~)
ColNameHeader = True
NumberDigits = 10
Col1= "Col1" Char Width 10
Col2= "Col2" Integer
Col3= "Col3" Char Width 2

Mit nur eine select-Anweisung:

SELECT * INTO [Text;DATABASE=c:\export\;FMT=Delimited(~)].[MyTable.txt] FROM [MyTable]

Total die FMT ignoriert. Ich fand es sehr schwer, Dokumentation über das Format der Parameter zu finden. Was immer ich in der FMT-Parameter eingegeben haben, die einzigen Dinge, die ich an die Arbeit konnte, wurde behoben. Alles andere wurde als CSVDelimited behandelt. Ich konnte chech dies als die select-Anweisung eine schema.ini Datei wie folgt erstellt:

[MyTable.txt]
ColNameHeader=True
CharacterSet=1252
Format=CSVDelimited
Col1=Col1 Char Width 10
Col2=Col2 Integer
Col3=Col3 Char Width 2

Meine Lösung war, meine eigene schema.ini dann die Select-Anweisung verwenden, um zu erstellen. Mein Modul Code etwa wie folgt aussieht:

Option Compare Database
Option Explicit

    Public Function CreateSchemaFile(bIncFldNames As Boolean, _
                                       sPath As String, _
                                       sSectionName As String, _
                                       sTblQryName As String) As Boolean


         Dim Msg As String
         On Local Error GoTo CreateSchemaFile_Err
         Dim ws As Workspace, db As Database
         Dim tblDef As TableDef, fldDef As Field
         Dim i As Integer, Handle As Integer
         Dim fldName As String, fldDataInfo As String
         ' -----------------------------------------------
         ' Set DAO objects.
         ' -----------------------------------------------
         Set db = CurrentDb()
         ' -----------------------------------------------
         ' Open schema file for append.
         ' -----------------------------------------------
         Handle = FreeFile
         Open sPath & "schema.ini" For Output Access Write As #Handle
         ' -----------------------------------------------
         ' Write schema header.
         ' -----------------------------------------------
         Print #Handle, "[" & sSectionName & "]"
         Print #Handle, "CharacterSet = Unicode"
         Print #Handle, "Format = Delimited(~)"
         Print #Handle, "ColNameHeader = " & _
                         IIf(bIncFldNames, "True", "False")
         Print #Handle, "NumberDigits = 10"
         ' -----------------------------------------------
         ' Get data concerning schema file.
         ' -----------------------------------------------
         Set tblDef = db.TableDefs(sTblQryName)
         With tblDef
            For i = 0 To .Fields.Count - 1
               Set fldDef = .Fields(i)
               With fldDef
                  fldName = .Name
                  Select Case .Type
                     Case dbBoolean
                        fldDataInfo = "Bit"
                     Case dbByte
                        fldDataInfo = "Byte"
                     Case dbInteger
                        fldDataInfo = "Short"
                     Case dbLong
                        fldDataInfo = "Integer"
                     Case dbCurrency
                        fldDataInfo = "Currency"
                     Case dbSingle
                        fldDataInfo = "Single"
                     Case dbDouble
                        fldDataInfo = "Double"
                     Case dbDate
                        fldDataInfo = "Date"
                     Case dbText
                        fldDataInfo = "Char Width " & Format$(.Size)
                     Case dbLongBinary
                        fldDataInfo = "OLE"
                     Case dbMemo
                        fldDataInfo = "LongChar"
                     Case dbGUID
                        fldDataInfo = "Char Width 16"
                  End Select
                  Print #Handle, "Col" & Format$(i + 1) _
                                  & "= """ & fldName & """" & Space$(1); "" _
                                  & fldDataInfo
               End With
            Next i
         End With
         CreateSchemaFile = True
CreateSchemaFile_End:
         Close Handle
         Exit Function
CreateSchemaFile_Err:
         Msg = "Error #: " & Format$(Err.Number) & vbCrLf
         Msg = Msg & Err.Description
         MsgBox Msg
         Resume CreateSchemaFile_End
      End Function

Public Function ExportATable(TableName As String)
Dim ThePath As String
Dim FileName As String
Dim TheQuery As String
Dim Exporter As QueryDef
ThePath = "c:\export\"
FileName = TableName + ".txt"
CreateSchemaFile True, ThePath, FileName, TableName
On Error GoTo IgnoreDeleteFileErrors
FileSystem.Kill ThePath + FileName
IgnoreDeleteFileErrors:
TheQuery = "SELECT * INTO [Text;DATABASE=" + ThePath + "].[" + FileName + "] FROM [" + TableName + "]"
Set Exporter = CurrentDb.CreateQueryDef("", TheQuery)
Exporter.Execute
End Function


Sub ExportTables()

    Dim lTbl As Long
    Dim dBase As Database
    Dim TableName As String

    Set dBase = CurrentDb

    For lTbl = 0 To dBase.TableDefs.Count - 1
         'If the table name is a temporary or system table then ignore it
        If Left(dBase.TableDefs(lTbl).Name, 1) = "~" Or _
        Left(dBase.TableDefs(lTbl).Name, 4) = "MSYS" Then
             '~ indicates a temporary table
             'MSYS indicates a system level table
        Else
          TableName = dBase.TableDefs(lTbl).Name
          ExportATable (TableName)
        End If
    Next lTbl
    Set dBase = Nothing
End Sub

Ich mache keine Ansprüche, dass dies elegant, aber es funktioniert. Beachten Sie auch, dass der Stackoverflow Code Formatter nicht meinen \“nicht mag, so ist es nicht recht meinen Code druckt sehr schön.

Andere Tipps

In Bezug auf diesen Thread ich auf eine unglaublich einfache Lösung gestolpert Lage zu sein, eine Spezifikation für alle Tabellen Exporte verwenden, während normalerweise würden Sie ein separates für jeden schaffen müssen; oder die Unterroutine, die von Richard A vorgesehen verwendet werden.

Der Ablauf ist wie folgt:

Erstellen Sie eine Spezifikation beispielsRohr | mit jedem Tisch begrenzt, öffnen Sie dann eine dynaset Abfrage in SQL Zugriff SELECT * FROM MSysIMEXColumns verwenden und dann einfach alle resultierenden Zeilen löschen. Nun wird diese Spezifikation nicht Fehler 3011 geben, wenn Sie eine andere Tabelle, das zu verwenden versuchen, die Sie die ursprüngliche Spezifikation erstellen und sind im Wesentlichen eine universelle Rohr Export-Spezifikation für jede Tabelle / Abfrage, die Sie mögen.

Dies wurde in Access 2003 so übernehmen entdeckt / geprüft werde ich auch für spätere Versionen.

Mit freundlichen Grüßen

Matt Donnan

Ich habe zwei Vorschläge für Sie:

  1. Achten Sie darauf, auf eine neue Zeile jede Einstellung in Ihrer [schema.ini] Datei setzen sind. (Sie haben es hier aufgelistet alle auf einer Linie, so dass ich dachte, dass ich sicher machen würde.)

  2. Vergessen Sie nicht, die Codepage-Argument (letzte), wenn Sie rufen Sie Ihren Transfer zu liefern. Hier ist eine Liste der unterstützten Werte, wenn Sie es brauchen:

http://msdn.microsoft.com/en-us/library /aa288104.aspx

Other than that, es sieht aus wie sollte Ihr Ansatz arbeiten.

Ich habe ein Teil der Antwort bekam:

Ich bin eine schema.ini Datei mit VBA zu schreiben, dann meinen Transfer tun. Dies schafft ein Exportformat on the fly. Das einzige Problem ist, obwohl mein schema.ini enthält:

ColNameHeader = True
CharacterSet = Unicode
Format = Delimited(~)

Nur die Kopfzeile wird in Unicode mit Tilde delimiters herauskommen. Der Rest der Zeilen sind ANSI mit Komma.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top