我想从MSAccess2003导出多个表的内容。 这些表包含unicode日语字符。 我想将它们存储为波形符分隔的文本文件。
我可以使用File / Export手动执行此操作,并在“Advanced”对话框中选择tilde作为Field Delimiter,将Unicode作为Code Page。
我可以将其存储为导出规范,但这似乎是特定于表格的。
我想使用VBA代码导出许多表。
到目前为止,我已经尝试过:
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
当我运行时,我得到一个例外:
运行时错误'3011': Microsoft Jet数据库引擎找不到对象“Allowance1 #txt”。确保对象存在,并且您正确拼写其名称和路径名。
如果我此时调试,TableName是'Allowance1',正如预期的那样。
我想我的UnicodeTilde导出规范是特定于表的,所以我不能将它用于多个表。
解决方案是什么?我应该使用除TransferText之外的其他东西,还是以编程方式创建导出规范?
任何帮助表示感谢。
答案 0 :(得分:2)
我最终解决了这个问题。 (我现在使用Access 2007但遇到与Access 2003相同的问题。)
首先,什么不起作用:
TransferText只会使Header Row 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参数中输入什么,我唯一可以上班的东西就是固定。其他所有内容都被视为CSVDelimited。我可以这样做,因为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代码格式化程序不喜欢我的\“,所以它不能很好地打印我的代码。
答案 1 :(得分:1)
关于这个线程,我偶然发现了一个非常简单的解决方案,因为它能够在所有表导出中使用一个规范,而通常你必须为每个表创建一个单独的规范;或使用Richard A提供的子程序。
流程如下:
创建一个规范,例如使用任何表分隔的管道|
,然后使用SQL SELECT * FROM MSysIMEXColumns
在访问中打开动态集查询,然后只删除所有结果行。现在,当您尝试使用与创建原始规范的表不同的表时,此规范不会给出错误3011,并且本质上是您希望的任何表/查询的通用管道导出规范。
这已在Access 2003中发现/测试过,因此我认为它也适用于更高版本。
亲切的问候,
马特唐南答案 2 :(得分:0)
我得到了部分答案:
我正在用VBA编写schema.ini文件,然后执行我的TransferText。这是在动态创建导出格式。唯一的问题是,虽然我的schema.ini包含:
ColNameHeader = True
CharacterSet = Unicode
Format = Delimited(~)
只有标题行在带有波浪号分隔符的unicode中出现。其余行是带逗号的ANSI。
答案 3 :(得分:0)
我有两条建议给你:
确保将[schema.ini]文件中的每个设置放在新行上。 (你已经把它列在一条线上,所以我想我确定了。)
调用TransferText时,不要忘记提供CodePage参数(最后一个)。如果需要,以下是支持值列表:
http://msdn.microsoft.com/en-us/library/aa288104.aspx
除此之外,看起来你的方法应该有效。