تصدير جداول MSAccess بتنسيق Unicode باستخدام محدد Tilde
سؤال
أريد تصدير محتويات عدة جداول من MSAccess2003.تحتوي الجداول على أحرف يابانية Unicode.أريد تخزينها كملفات نصية محددة تيلدا.
يمكنني القيام بذلك يدويًا باستخدام ملف/تصدير، وفي مربع الحوار "خيارات متقدمة" تحديد التلدة كمحدد للحقل و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، أو ربما إنشاء مواصفات التصدير برمجيًا؟
أي مساعدة موضع تقدير.
المحلول
لقد قمت بحل هذا في النهاية.(أنا الآن أستخدم Access 2007 ولكني أواجه نفس المشكلات كما هو الحال مع Access 2003.)
أولاً، ما الذي لم ينجح:
لن يؤدي TransferText إلا إلى تحديد الكود الموحد لصف الرأس والتلدة، حتى مع وجود 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 * INTO [Text;DATABASE=c:\export\;FMT=Delimited(~)].[MyTable.txt] FROM [MyTable]
تجاهلت تماما معاهدة FMT.لقد وجدت أنه من الصعب جدًا العثور على وثائق حول تنسيق المعلمات.مهما كتبت في معلمة FMT، فإن الأشياء الوحيدة التي تمكنت من تشغيلها كانت ثابتة.تم التعامل مع كل شيء آخر على أنه CSVDelimited.يمكنني التحقق من ذلك لأن عبارة التحديد أنشأت ملف 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 الخاص بي ثم استخدام عبارة التحديد.يبدو رمز الوحدة النمطية الخاص بي كما يلي:
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 لا يحب \"، لذا فهو لا يطبع الكود الخاص بي بشكل جيد جدًا.
نصائح أخرى
في علاقة لهذا الموضوع لقد تعثرت عبر حل بسيط للغاية لكونه قادرا على استخدام مواصفات واحدة في جميع الصادرات الجدول في حين عادة قد تضطر إلى إنشاء واحدة منفصلة لكل. أو استخدام روتين فرعي التي تقدمها ريتشارد A.
وهذه العملية هي كما يلي:
وإنشاء مواصفات منها مثلا الأنابيب |
محدد مع أي جدول، ثم فتح استعلام الحيوية في الوصول باستخدام SQL SELECT * FROM MSysIMEXColumns
ثم ببساطة حذف كافة الصفوف الناتجة عن ذلك. الآن فإن هذه المواصفات لا يعطي خطأ 3011 عند محاولة استخدام جدول مختلفة عن تلك التي تستخدم لخلق المواصفات الأصلية وهي في جوهرها عالمية المواصفات تصدير الأنابيب لأي الجدول / الاستعلام الذي ترغب في ذلك.
وهذا قد اكتشفت / اختبار في وصول 2003 لذلك أفترض ستعمل الإصدارات اللاحقة أيضا.
وبالنسبة لنوع،
ومات دونان
عندي اقتراحين لك:
تأكد من وضع كل إعداد في ملف [schema.ini] الخاص بك في سطر جديد.(لقد أدرجتها هنا كلها في سطر واحد، لذا اعتقدت أنني سأتأكد).
لا تنس توفير وسيطة CodePage (الأخيرة) عند الاتصال بـ TransferText الخاص بك.فيما يلي قائمة بالقيم المدعومة إذا كنت في حاجة إليها:
http://msdn.microsoft.com/en-us/library/aa288104.aspx
بخلاف ذلك، يبدو أن أسلوبك يجب أن ينجح.
ولقد حصلت على جزء من الجواب:
وأنا أكتب ملف Schema.ini مع VBA، ثم اقوم TransferText. هذا هو خلق تنسيق التصدير على الطاير. والمشكلة الوحيدة هي، على الرغم من بلدي schema.ini يحتوي على:
ColNameHeader = True
CharacterSet = Unicode
Format = Delimited(~)
وصف الرأس فقط هو الخروج في يونيكود مع المحددات التلدة. بقية الصفوف ANSI بفواصل.