Создание БД Access 07 с помощью VB.net всегда запускает восстановление при первом открытии.

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

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

person Fred Quatro    schedule 31.12.2016    source источник
comment
Кажется, вы не создали Table1 при создании базы данных. Может, это проблема. Кроме того, вы должны использовать conn.Dispose(), когда закончите с ним (в обоих местах), а не conn = Nothing.   -  person Andrew Morton    schedule 01.01.2017
comment
Table1 создается при выполнении команды SELECT.   -  person Fred Quatro    schedule 02.01.2017
comment
Метод .Dispose () не является членом используемого мной объекта OleDb.OleDbConnection. Может быть, разные версии?   -  person Fred Quatro    schedule 02.01.2017
comment
Методы OleDbConnection перечисляет .Dispose() как доступный метод.   -  person Andrew Morton    schedule 02.01.2017
comment
Возможно, Программный доступ к функции «Сжать и восстановить» даст вам некоторое представление о том, как выполнить ремонт в вашей программе.   -  person Andrew Morton    schedule 02.01.2017
comment
@AndrewMorton «Сжатие и программный ремонт» указала мне правильное направление. Я надеялся создать БД без ремонта, но это лучший вариант. Спасибо, Андрей.   -  person Fred Quatro    schedule 05.01.2017
comment
Пожалуйста :) Я все еще считаю, что явное создание таблицы с правильными столбцами имеет шанс работать.   -  person Andrew Morton    schedule 05.01.2017


Ответы (1)


Казалось, это помогло

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
person Fred Quatro    schedule 05.01.2017