سؤال

أريد تصدير محتويات عدة جداول من 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 لذلك أفترض ستعمل الإصدارات اللاحقة أيضا.

وبالنسبة لنوع،

ومات دونان

عندي اقتراحين لك:

  1. تأكد من وضع كل إعداد في ملف [schema.ini] الخاص بك في سطر جديد.(لقد أدرجتها هنا كلها في سطر واحد، لذا اعتقدت أنني سأتأكد).

  2. لا تنس توفير وسيطة CodePage (الأخيرة) عند الاتصال بـ TransferText الخاص بك.فيما يلي قائمة بالقيم المدعومة إذا كنت في حاجة إليها:

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

بخلاف ذلك، يبدو أن أسلوبك يجب أن ينجح.

ولقد حصلت على جزء من الجواب:

وأنا أكتب ملف Schema.ini مع VBA، ثم اقوم TransferText. هذا هو خلق تنسيق التصدير على الطاير. والمشكلة الوحيدة هي، على الرغم من بلدي schema.ini يحتوي على:

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

وصف الرأس فقط هو الخروج في يونيكود مع المحددات التلدة. بقية الصفوف ANSI بفواصل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top