Pergunta

Eu quero exportar o conteúdo de várias mesas de MSAccess2003. As tabelas contêm caracteres japoneses unicode. Eu quero armazená-los como til arquivos de texto delimitado.

Eu posso fazer isso manualmente usando Arquivo / Exportar e, no 'Advanced' til seleção de diálogo como delimitador de campo eo Unicode como a página de código.

posso guardar isso como uma especificação de exportação, mas este parece ser tabela específica.

Eu quero exportar muitas tabelas utilizando código VBA.

Até agora eu tentei:

Sub 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

Quando eu executar este eu recebo uma exceção:

Run-time error '3011': O motor de banco de dados Microsoft Jet não conseguiu localizar o objecto "Allowance1 # txt'. Certifique-se o objeto existe e que você escrever seu nome eo nome de caminho corretamente.

Se eu depuração neste momento, TableName é 'Allowance1', como esperado.

Eu acho que a minha especificação de exportação UnicodeTilde é a tabela específica, então não posso usá-lo para várias tabelas.

Qual é a solução? Devo usar outra coisa, que não seja TransferText, ou talvez criar a especificação de exportação programaticamente?

Qualquer ajuda apreciado.

Foi útil?

Solução

Eu finalmente resolvido isso. (Agora estou usando Access 2007, mas teve os mesmos problemas que com o Access 2003).

Em primeiro lugar, o que não funcionou:

TransferText só faria o unicode linha de cabeçalho e til delimitada, mesmo com um schema.ini formatado corretamente. (Não, eu não colocá-lo em uma única linha, que era apenas um problema de formatação com o html em stackoverflow.)

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

Apenas usando uma instrução select:

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

totalmente ignorado a FMT. Achei muito difícil encontrar documentação sobre o formato dos parâmetros. O que quer que eu digitei no parâmetro FMT, as únicas coisas que eu poderia começar a trabalhar foi corrigido. Tudo o resto foi tratado como CSVDelimited. Eu poderia chech isso como a instrução select criado um arquivo schema.ini assim:

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

Meu eventual solução foi criar meu próprio schema.ini, em seguida, usar a instrução select. Minha aparência Módulo Código de algo como isto:

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

Eu não faço nenhuma reivindicação que este é elegante, mas funciona. Observe também que o formatador de código stackoverflow não gosta meu \", por isso não muito imprimir meu código muito bem.

Outras dicas

Em relação a esta discussão eu ter tropeçado uma solução incrivelmente simples para ser capaz de usar uma especificação em todas as exportações de mesa enquanto que normalmente você teria que criar um separado para cada um; ou usar o sub rotina fornecido por Richard A.

O processo é o seguinte:

Criar uma especificação por exemplo Cachimbo | delimitado com qualquer tabela, em seguida, abrir uma consulta dynaset no acesso usando SELECT * FROM MSysIMEXColumns SQL e depois simplesmente apagar todas as linhas resultantes. Agora, esta especificação não vai dar erro 3011 quando você tentar usar uma tabela diferente da que você usou para criar a especificação original e é essencialmente uma especificação universal de exportação da tubulação para qualquer tabela / consulta desejar.

Esta foi descoberto / testado no Access 2003 assim que eu supor vai funcionar para versões posteriores também.

Atenciosamente,

Matt Donnan

Eu tenho duas sugestões para você:

  1. Certifique-se de que você está colocando cada configuração em seu arquivo [schema.ini] em uma nova linha. (Você listei-lo aqui em uma única linha, então eu pensei que eu ia ter certeza.)

  2. Não se esqueça de fornecer o argumento CodePage (última) quando você chamar seu TransferText. Aqui está uma lista de valores suportados se você precisar dele:

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

Além disso, parece que a sua abordagem deve funcionar.

Eu tenho uma parte da resposta:

Eu estou escrevendo um arquivo schema.ini com VBA, em seguida, fazendo o meu TransferText. Isso está criando um formato de exportação na mosca. O único problema é que, embora o meu schema.ini contém:

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

Somente a linha de cabeçalho está saindo em unicode com delimitadores til. O restante das linhas são ANSI com vírgulas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top