VB.Net: DAO Object не будет создавать DBEngine - PullRequest
1 голос
/ 08 октября 2010

Я использую динамически созданную базу данных Access в качестве временного хранилища для вводимого файла. Я знаю, что все работает, так как на моем компьютере разработчика я могу запустить этот код. Но на другой системе (Win 7) это не работает. Меня останавливают на этой линии ...

DAOEngine = New DAO.DBEngine

Когда он попадает сюда, он просто выдает ошибку ...

Creating an instance of the COM component with CLSID {00000010-0000-0010-8000-00AA006D2EA4} from the IClassFactory failed due to the following error: 80040112.

Я искал ошибку и не могу понять, о чем она говорит, кроме того, что я использую старый способ создания баз данных. И сейчас я надеялся на быстрое исправление, а не на переписывание способа работы моего хранилища.

Опять же, я знаю, что мой код верен, потому что моя машина Dev скомпилирует и выполняет этот код просто отлично. Я опубликую весь метод на случай, если что-то упущу.

    Private Sub ProcessFile(ByVal Exportname As String, ByVal ExportFile As String, ByVal ImportFile As String)
    ' Aperture variables
    Dim Table As Object 'OETable
    Dim Fields As Object 'OEFields

    ' DAO database variables
    Dim DAOEngine As DAO.DBEngine
    Dim rst As DAO.Recordset
    Dim ws As DAO.Workspace
    Dim db As DAO.Database
    Dim tbl As DAO.TableDef
    Dim fld As DAO.Field

    ' Integer vars
    Dim fieldcount As Integer
    Dim I As Integer
    Dim j As Integer
    ' Boolean Variables
    Dim CalcTotals As Boolean = False
    ' String Array Variables
    Dim headers() As String = Nothing
    ' String Variables
    Dim lvl_lookup As String
    Dim outputlist As String
    Dim throwaway As String = ""
    Dim totalstring As String
    ' Array vars
    Dim totals() As Object

    ' Use an access database to add the serial numbers
    'ws = DAODBEngine_definst.Workspaces(0)
    DAOEngine = New DAO.DBEngine
    ws = DAOEngine.Workspaces(0)
    If File.Exists(alAperture.prjPath & "\temp.mdb") Then
        File.Delete(alAperture.prjPath & "\temp.mdb")
    End If
    db = ws.CreateDatabase(alAperture.prjPath & "\temp.mdb", DAO.LanguageConstants.dbLangGeneral)
    tbl = db.CreateTableDef("legend")

    If alAperture.tbls.Item(Exportname & " Table") Is Nothing Then
        Table = alAperture.tbls.Item("Legend Text Table")
    Else
        Table = alAperture.tbls.Item(Exportname & " Table")
    End If

    Fields = Table.Fields
    fieldcount = Fields.Count
    ' Create the fields
    For I = 0 To fieldcount - 1
        If Fields.Item(I).DataType = 2 Then
            ' We have a numeric field
            fld = tbl.CreateField(Fields.Item(I).Name, 6)
            CalcTotals = True
        Else
            fld = tbl.CreateField(Fields.Item(I).Name, 10, 255)
            fld.AllowZeroLength = True
        End If
        tbl.Fields.Append(fld)
    Next
    ' Create the table
    db.TableDefs.Append(tbl)

    ' Open the table as a recordset
    rst = db.OpenRecordset("legend", DAO.RecordsetTypeEnum.dbOpenTable)
    ' Open the exportfile for read
    Dim streamIn As StreamReader = New StreamReader(ExportFile)
    ReDim totals(fieldcount - 1)

    I = 0
    lvl_lookup = ""

    Do
        ' Grab next record and redim to dimension of table, minus the series column
        Dim nextRecord() As String = Split(streamIn.ReadLine, """,""")
        ReDim Preserve nextRecord(fieldcount - 1)
        If I = 0 Then
            headers = nextRecord
            I = 1
        Else
            ' *** HEADER RECORD
            If lvl_lookup = "" Then
                lvl_lookup = nextRecord(0)
                ' Add the header record
                rst.AddNew()
                rst.Fields(0).Value = lvl_lookup
                rst.Fields(1).Value = 0
                For j = 2 To fieldcount - 1
                    If rst.Fields(j).Type = 10 Then
                        rst.Fields(j).Value = Replace(headers(j - 1), """", "")
                    Else
                        rst.Fields(j).Value = 0
                    End If
                Next
                rst.Update()
            End If
            ' *** RECORDS
            If nextRecord(0) = lvl_lookup Then
                ' addrecords
                addrecord(totals, nextRecord, rst, fieldcount, I)
            Else
                ' add total row
                ' padlines
                If CalcTotals Then
                    rst.AddNew()
                    rst.Fields(0).Value = lvl_lookup
                    rst.Fields(1).Value = I
                    totalstring = "Total:"
                    For j = 2 To fieldcount - 2
                        If rst.Fields(j).Type = 6 Then
                            If IsNothing(totals(j)) Then
                                rst.Fields(j).Value = 0
                            Else
                                rst.Fields(j).Value = totals(j)
                            End If
                        Else
                            rst.Fields(j).Value = totalstring
                            totalstring = ""
                        End If
                    Next
                    rst.Fields(9).Value = 0
                    rst.Update()
                    I = I + 1
                End If
                'padlines
                While I <= 80
                    rst.AddNew()
                    rst.Fields(0).Value = lvl_lookup
                    rst.Fields(1).Value = I
                    rst.Update()
                    I = I + 1
                End While
                I = 1
                lvl_lookup = nextRecord(0)
                ReDim totals(fieldcount - 2)
                ' add record
                addrecord(totals, nextRecord, rst, fieldcount, I)
            End If
            If streamIn.EndOfStream Then
                ' add total row
                ' padlines
                If CalcTotals Then
                    rst.AddNew()
                    rst.Fields(0).Value = lvl_lookup
                    rst.Fields(1).Value = I
                    totalstring = "Total:"
                    For j = 2 To fieldcount - 2
                        If rst.Fields(j).Type = 6 Then
                            If IsNothing(totals(j)) Then
                                rst.Fields(j).Value = 0
                            Else
                                rst.Fields(j).Value = totals(j)
                            End If
                        Else
                            rst.Fields(j).Value = totalstring
                            totalstring = ""
                        End If
                    Next
                    rst.Fields(9).Value = 0
                    rst.Update()
                    I = I + 1
                End If
                'padlines
                While I <= 80
                    rst.AddNew()
                    rst.Fields(0).Value = lvl_lookup
                    rst.Fields(1).Value = I
                    rst.Update()
                    I = I + 1
                End While
            End If
        End If
    Loop Until streamIn.EndOfStream
    streamIn.Close()
    ' ok lets write the import file

    Dim streamOut As StreamWriter = New StreamWriter(ImportFile)
    rst.MoveFirst()
    Do Until rst.EOF
        outputlist = Chr(34) & rst.Fields(0).Value & Chr(34) & "," & Chr(34) & VB6.Format(rst.Fields(1).Value, "00") & Chr(34)
        For j = 2 To fieldcount - 1
            outputlist = outputlist & "," & Chr(34) & rst.Fields(j).Value & Chr(34)
        Next
        streamOut.WriteLine(outputlist)
        rst.MoveNext()
    Loop
    streamOut.Close()
    rst.Close()
    db.Close()
    ws.Close()

    rst = Nothing
    db = Nothing
    ws = Nothing
    fld = Nothing
    tbl = Nothing
    Table = Nothing
    Fields = Nothing
End Sub

1 Ответ

2 голосов
/ 10 октября 2010

Используете ли вы Microsoft DAO 3.6?Использование «Библиотеки совместимости Microsoft DAO 2.5 / 3.51» очень старое.DAO 3.5 - это версия, поставляемая с Access 97.

Позже Я должен был выполнить поиск по GUID в сообщении об ошибке.Да, этот GUID предназначен для DAO 3.5, который очень старый и поставляется с Access 97 и Visual Basic 6. Используйте DAO 3.6 / Jet 4.0, который поставляется с Weindows 2000 и более новыми ОС.

С PRB: CLSID{00000010-0000-0010-8000-00AA006D2EA4} не найден при запуске приложения"CLSID {00000010-0000-0010-8000-00AA006D2EA4}} связан с DAO350.dll."

...