2010-10-08 46 views
1

J'utilise une base de données Access créée dynamiquement comme stockage temporaire pour un fichier en cours d'entrée. Je sais que tout fonctionne, comme sur ma machine dev, je peux faire fonctionner ce code. Mais sur un autre système (Win 7) ça ne marche pas. Je suis d'être arrêté à cette ligne ...VB.Net: L'objet DAO ne crée pas DBEngine

DAOEngine = New DAO.DBEngine 

Quand il est ici, il jette juste une erreur ...

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

J'ai cherché l'erreur, et je ne peux pas donner un sens à ce qu'il me dit d'autre alors j'utilise une ancienne façon de créer des bases de données. Et maintenant, j'espérais une solution rapide plutôt que de réécrire le fonctionnement de mon stockage.

Encore une fois, je sais que mon code est correct car ma machine de développement compile et exécute ce code très bien. Je posterai toute la méthode au cas où il me manque quelque chose d'autre.

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 

Répondre

2

Utilisez-vous Microsoft DAO 3.6? L'utilisation de 'Microsoft DAO 2.5/3.51 Compatibility Library' est très ancienne. DAO 3.5 est la version fournie avec Access 97.

Plus tard J'aurais dû faire une recherche sur le GUID dans le message d'erreur. Oui, ce GUID est pour DAO 3.5 qui est très ancien et est livré avec Access 97 et Visual Basic 6. Utilisez DAO 3.6/Jet 4.0 qui vient avec Weindows 2000 et les nouveaux systèmes d'exploitation.

De PRB: CLSID {00000010-0000-0010-8000-00AA006D2EA4} Not Found When You Run an Application "Le {00000010-0000-0010-8000-00AA006D2EA4} CLSID est associé à DAO350.dll."

+0

+1. DAO 3.6 est la dernière version et il fait maintenant partie de Windows (comme Tony me l'a rappelé) donc il n'y a pas besoin de l'installer. Je pense que vous devriez installer DAO 3.5 si vous utilisiez cela (corrections bienvenues si c'est faux aussi). 'Microsoft DAO 2.5/3.51 Compatibility Library' a été fourni pour aider à la mise à niveau de VB3 et est en effet assez vieux. – MarkJ

+0

Si vous voulez utiliser DAO 3.5 alors oui vous devrez l'installer. Bien sûr, étant donné que DAO 3.6, et Jet 4.0, est livré avec Windows 2000 et plus récent, vous seriez stupide d'utiliser 3.5 aujourd'hui. –

+0

Ouais, c'était tout. J'étais juste confus que mon ordinateur avait la version 3.5 installée et les autres n'ont pas. Merci! – CrystalBlue