代码之家  ›  专栏  ›  技术社区  ›  Richard A

将MSAccess表导出为带颚化符分隔符的Unicode

  •  2
  • Richard A  · 技术社区  · 17 年前

    我想从MSAccess2003导出几个表的内容。 这些表包含Unicode日语字符。 我想将它们存储为颚化符分隔的文本文件。

    我可以使用文件/导出手动执行此操作,并在“高级”对话框中选择tilde作为字段分隔符,Unicode作为代码页。

    我可以将其存储为导出规范,但这似乎是特定于表的。

    我想用VBA代码导出许多表。

    到目前为止,我已经尝试过:

    子导出表()

    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
    

    结束子

    当我运行此程序时,会得到一个异常:

    运行时错误“3011”: Microsoft Jet数据库引擎找不到对象“allowance1 txt”。确保对象存在,并且正确拼写其名称和路径名。

    如果我在这一点上进行调试,那么tablename如预期的那样是'allowance1'。

    我想我的unicodetilde导出规范是特定于表的,所以我不能将它用于多个表。

    解决方案是什么?我应该使用TransferText以外的其他东西,还是通过编程创建导出规范?

    感谢您的帮助。

    4 回复  |  直到 14 年前
        1
  •  2
  •   Richard A    17 年前

    我最终解决了这个问题。(我现在使用的是Access 2007,但与Access 2003的问题相同。)

    首先,不起作用的是:

    transfertext将只使标题行Unicode和tilde分隔,即使使用格式正确的schema.ini。(不,我没有把它们放在一行上,这只是stackoverflow上HTML的格式问题。)

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

    仅使用select语句:

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

    完全忽略了FMT。我发现很难找到关于参数格式的文档。无论我在fmt参数中键入什么,我唯一能做的就是修复它。其他的一切都被视为犯罪嫌疑人。我可以将其作为select语句创建的schema.ini文件,如下所示:

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

    我的最终解决方案是创建自己的schema.ini,然后使用select语句。我的模块代码如下所示:

    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
    

    我没有说这是优雅的,但它是有效的。还要注意stackoverflow代码格式化程序不喜欢我的\“,所以它不能很好地打印我的代码。

        2
  •  1
  •   GDP Danny    14 年前

    关于这个线程,我偶然发现了一个非常简单的解决方案,它能够在所有表导出中使用一个规范,而通常情况下,您需要为每个导出创建一个单独的规范;或者使用Richard A提供的子例程。

    过程如下:

    创建规范,例如管道 | 用任何表分隔,然后使用SQL在Access中打开dynaset查询 SELECT * FROM MSysIMEXColumns 然后简单地删除所有结果行。现在,当您尝试使用与创建原始规范不同的表时,此规范不会给出错误3011,它本质上是用于任何表/查询的通用管道导出规范。

    这在Access2003中被发现/测试过,所以我认为在以后的版本中也可以使用。

    亲切的问候,

    马特唐南

        3
  •  0
  •   Tim Lara    17 年前

    我有两个建议给你:

    1. 确保将[schema.ini]文件中的每个设置都放到新行中。(你已经把它列在这里了,所以我想我会确定的。)

    2. 调用TransferText时,不要忘记提供代码页参数(最后一个)。如果需要,下面列出了支持的值:

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

    除此之外,看起来您的方法应该有效。

        4
  •  0
  •   Richard A    17 年前

    我得到了部分答案:

    我正在用vba编写一个schema.ini文件,然后执行transfertext。这将动态创建导出格式。唯一的问题是,尽管我的schema.ini包含:

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

    只有标题行以带颚化符分隔符的Unicode格式出现。其余的行是带逗号的ANSI。