2016-12-31 2 views
0

У меня есть приложение VB.NET (Visual Studio 2010), которое создает программную базу Access 07, а затем импортирует CSV-файл в качестве новой таблицы Access , БД создается, и CSV импортируется без проблем. В коде используется ADOX.Catalog для создания базы данных и OleDb.OleDbConnection с ACE для импорта CSV. Все хорошо, кроме первого раза, когда я открываю БД доступа. Когда я запускаю Access 07 с моего рабочего стола (Office 07), я получаю зеленый индикатор выполнения «ремонта» в правом нижнем углу экрана около 5 секунд. Это происходит только при первом открытии БД. БД и таблицы работают нормально, но Access определенно что-то фиксирует. Я могу воссоздать это поведение каждый раз. Как я могу избежать ремонта при первом открытии базы данных? Любые идеи были бы полезны.Создание Access 07 DB с VB.net всегда запускается Ремонт при открытии его в первый раз

Public Function CreateTaxDatabase(ByVal DatabaseFullPath As String) As Boolean 

    Dim bAns As Boolean 
    Dim cat As ADOX.Catalog 

    Try 
    '' check if file exists 
    If System.IO.File.Exists(DatabaseFullPath) Then 
     '' delete the old file 
     System.IO.File.Delete(DatabaseFullPath) 
    End If 

    Dim sCreateString As String 
    cat = New ADOX.Catalog() 
    sCreateString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & DatabaseFullPath 
    cat.Create(sCreateString) 

    '' close the connection 
    Dim connection As ADODB.Connection = DirectCast(cat.ActiveConnection, ADODB.Connection) 
    connection.Close() 
    bAns = True 
    Catch Excep As System.Runtime.InteropServices.COMException 
    bAns = False 
    Finally 
    cat = Nothing 
    End Try 
    Return bAns 
End Function 

Sub ImportCSV(dbPath As String, CSVPath As String, CSVFile as String) 

    Dim conn As OleDb.OleDbConnection = Nothing 
    Dim SQL As String = "" 

    Try 
    conn = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + dbPath) 
    If conn.State = ConnectionState.Closed Then 
     conn.Open() 
    End If 
    Catch ex As Exception 
    MsgBox(ex.Message, MsgBoxStyle.Exclamation + MsgBoxStyle.OkOnly, "Error Connecting to Database") 
    If conn.State = ConnectionState.Open Then 
     conn.Close() 
    End If 
Return 
    End Try 

    SQL = "SELECT * INTO Table1 FROM [Text;FMT=Delimited;HDR=Yes;CharacterSet=ANSI;DATABASE=" + CSVPath + "].[" + CSVFile + "]" 

    Try 
    Dim SQLCmd As OleDb.OleDbCommand = conn.CreateCommand 
    SQLCmd.CommandText = SQL 
    SQLCmd.ExecuteNonQuery() 
    Application.DoEvents() 
    Catch ex As Exception 
    SQL = "There was an error executing the following SQL Statement:" + vbCrLf + _ 
     SQL + vbCrLf + "Error - " + Trim(Str(Err.Number)) + " " + Err.Description 
    MsgBox(SQL, MsgBoxStyle.Exclamation + MsgBoxStyle.OkOnly, "SQL Error") 
    Finally 
    If conn.State = ConnectionState.Open Then 
     conn.Close() 
    End If 
    If Not IsNothing(conn) Then 
     conn = Nothing 
    End If 
    End Try 
End Sub 
+0

Вы, кажется, не создавших 'Table1' при создании базы данных. Возможно, это проблема. Кроме того, вы должны использовать 'conn.Dispose()', когда вы закончите с ним (в * обоих * местах), а не 'conn = Nothing'. –

+0

Таблица 1 создается при выполнении команды SELECT. –

+0

Метод .Dispose() не является членом объекта OleDb.OleDbConnection, который я использую. Может быть, разные версии? –

ответ

0

Это, казалось, сделать трюк

Public Sub CompactRepairDB(DBPath As String) 
    '' compact and repair DB 
    Dim AccessApp As Microsoft.Office.Interop.Access.Application = New Microsoft.Office.Interop.Access.Application() 
    Dim TempDB = GetFilePath(DBPath) + "Compact1.ACCDB" 

    DeleteFile(TempDB) 
    AccessApp.OpenCurrentDatabase(DBPath) 
    AccessApp.CloseCurrentDatabase() 
    AccessApp.CompactRepair(DBPath, TempDB) 
    AccessApp.Quit() 
    DeleteFile(DBPath) 
    '' rename Compact1 to Original DB Name 
    My.Computer.FileSystem.RenameFile(TempDB, GetFileName(DBPath)) 
End Sub 
Смежные вопросы