2008-10-02 43 views
2

我想从MSAccess2003中导出多个表格的内容。 这些表包含unicode日文字符。 我想将它们存储为波形分隔的文本文件。将MSAccess表格导出为带有Tilde分隔符的Unicode

我可以使用File/Export手动执行此操作,并在'高级'对话框中选择代字号作为字段分隔符,并将Unicode作为代码页。

我可以将其存储为Export Specification,但这似乎是表格特定的。

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

到目前为止,我曾尝试:

子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 

末次

当我运行此我得到一个异常:

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

如果我在这一点上调试,TableName是'Allowance1',如预期。

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

解决方案是什么?我是否应该使用除TransferText外的其他内容,或者可能以编程方式创建导出规范?

任何帮助表示赞赏。

回答

2

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

首先,什么没有奏效:

TransferText只会使标题行Unicode和波浪线分隔,即使有正确格式化的schema.ini。 (不,我没有把它全部在一行,这仅仅是一个格式问题与计算器的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参数中输入什么内容,唯一可以使用的东西是Fixed。其他一切都被视为CSVDelimited。我可以再检查一下这是创建schema.ini文件这样的select语句:

[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代码格式化程序不喜欢我的“,所以它不漂亮打印我的代码。

0

我已经得到了部分答案:

我正在写与VBA Schema.ini文件,然后做我的TransferText。这正在创建一个导出格式。唯一的问题是,尽管我的schema.ini包含:

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

只有标题行出现在带有波形符号分隔符的unicode中。其余的行是带逗号的ANSI。

0

我有两个建议供您参考:

  1. 确保你把每一个设置在[SCHEMA.INI]文件上一个新行。 (你已经在这里列出所有的一行,所以我想我会确保。)

  2. 当你调用你的TransferText时,不要忘记提供CodePage参数(最后一个)。下面是支持的值的列表,如果你需要它:

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

除此之外,它看起来像你的方法应该工作。

1

关于此线程我偶然发现了一个令人难以置信的简单的解决方案,可以使用一个在所有表出口规范,而通常你必须为每一个单独的一个,或者使用由Richard A.提供的子程序

的过程如下:

创建规范如管|划界任何表,然后使用SQL SELECT * FROM MSysIMEXColumns在访问中打开一个动态集查询,然后简单地删除所有结果行。现在这个规范不会给错误3011,当您尝试使用不同的表来创建原始规格时,它基本上是您希望的任何表/查询的通用管道导出规格。

这已在2003年访问中发现/测试,所以我认为它也适用于更高版本。

亲切的问候,

马特·唐南

+0

感谢马特。从我做这件事以来,这已经过去了很久了,但是当我有一分钟时,我会试试看。 – 2011-05-24 22:41:33

相关问题