Я использую динамически созданную базу данных 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