views:

51

answers:

1

I'm using a dynamically created Access database as a temporary storage for a file being inputed. I know that everything works, as on my dev machine I can get this code to run. But on another system (Win 7) it's not working. I'm being stopped at this line...

DAOEngine = New DAO.DBEngine

When it gets here, it just throws an error...

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

I have searched for the error, and I can't make sense of what it's telling me other then I'm using an old way of creating databases. And right now, I was hoping for a quick fix rather then rewriting the way my storage is working.

Again, I know my code is correct because my Dev machine compiles and runs this code just fine. I'll post the entire method in case there's something else I'm missing.

    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
+2  A: 

Are you using Microsoft DAO 3.6? Using 'Microsoft DAO 2.5/3.51 Compatibility Library' is very old. DAO 3.5 is the version which comes with Access 97.

Later I should've done a search on the GUID in the error message. Yes, that GUID is for DAO 3.5 which is very old and comes with Access 97 and Visual Basic 6. Use DAO 3.6/Jet 4.0 which comes with Weindows 2000 and newer OSs.

From PRB: CLSID {00000010-0000-0010-8000-00AA006D2EA4} Not Found When You Run an Application "The {00000010-0000-0010-8000-00AA006D2EA4} CLSID is associated with DAO350.dll."

Tony Toews
+1. DAO 3.6 is the latest version and it is now part of Windows (as Tony reminded me) so there's no need to install it. I think you would have to install DAO 3.5 if you were using that (corrections welcome if that's wrong too). 'Microsoft DAO 2.5/3.51 Compatibility Library' was provided to assist with upgrading from VB3 and is indeed pretty old.
MarkJ
If you wanted to use DAO 3.5 then yes you'd have to install it. Of course given that DAO 3.6, and Jet 4.0, comes with Windows 2000 and newer you'd be foolish to use 3.5 today.
Tony Toews
Yup, this was it. I was just confused that my computer had the 3.5 version installed and the others didn't. Thanks!
CrystalBlue
MarkJ, us Access folks look at the Compatibility Library as assisting in the upgrade from Access 2.0. <smile> Strictly speaking DAO 3.6 is not the latest version. The Access group has forked the source code and is calling in ACE with some new features. But mostly irrelevant to this discussion as, if at all possible, you should stick with what comes with the OS to avoid installation.
Tony Toews