System.AccessViolationException при запросе базы данных Access в Office x64

Я получаю следующую ошибку:

An unhandled exception of type 'System.AccessViolationException' occurred. Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

Вот код, в котором генерируется необработанное исключение (ExecuteScalar):

Public Shared Function RequeteScalarInteger(ByVal pConnectionBDD As OleDb.OleDbConnection, ByVal pStrSql As String) As Integer
    Dim retour As Object = -1
    Try
        Dim command As OleDbCommand = New OleDbCommand(pStrSql, pConnectionBDD)
        retour = command.ExecuteScalar() 'here is the unhandled error
        If IsNumeric(retour) Then
            retour = CInt(retour)
        ElseIf retour Is DBNull.Value Then
            retour = -1
        ElseIf retour = Nothing Then
            retour = 0
        Else
            retour = -1
        End If
        command = Nothing
    Catch ex As Exception
        retour = -1
        Debug.Write("RequeteScalarInteger:" & pStrSql)
        My.Application.Log.WriteEntry(Now & " - " & ex.Message & vbCrLf & ex.StackTrace & vbCrLf & pStrSql)
    End Try
    Return CInt(retour)
End Function

Вот строка подключения:

"Provider=Microsoft.ACE.OLEDB.12.0;Data source=" & pPathBDD

А вот трассировка стека:

   at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
   at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
   at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
   at System.Data.OleDb.OleDbCommand.ExecuteScalar()
   at QuizzDll.Bdd.RequeteScalarInteger(OleDbConnection pConnectionBDD, String pStrSql) in C:\QuizzBox_Solution_Git\QuizzDll\modules\Bdd.vb:line 273
   at QuizzDll.Bdd.RequeteScalarInteger(String pStrSql) in C:\QuizzBox_Solution_Git\QuizzDll\modules\Bdd.vb:line 259
   at QuizzDll.Bdd.GetClePrimaire(String pStrNomTable) in C:\QuizzBox_Solution_Git\QuizzDll\modules\Bdd.vb:line 518
   at QuizzDll.ListePersonneSessionActive.Adapter_RowUpdated(Object sender, OleDbRowUpdatedEventArgs e) in C:\QuizzBox_Solution_Git\QuizzDll\Session\ListePersonneSessionActive.vb:line 1088
   at System.Data.OleDb.OleDbDataAdapter.OnRowUpdated(RowUpdatedEventArgs value)
   at System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows, DataTableMapping tableMapping)
   at System.Data.Common.DbDataAdapter.UpdateFromDataTable(DataTable dataTable, DataTableMapping tableMapping)
   at System.Data.Common.DbDataAdapter.Update(DataTable dataTable)
   at QuizzDll.dsListePersonneFiltreTableAdapters.tPersonneTableAdapter.Update(tPersonneDataTable dataTable) in C:\QuizzBox_Solution_Git\QuizzDll\Datasets\dsListePersonneFiltre.Designer.vb:line 3209
   at QuizzDll.ListePersonneSessionActive.UpdateInBDD() in C:\QuizzBox_Solution_Git\QuizzDll\Session\ListePersonneSessionActive.vb:line 1070
   at QuizzDll.ListePersonneSessionActive.ListePersonneSessionActive_ListChanged(Object sender, ListChangedEventArgs e) in C:\QuizzBox_Solution_Git\QuizzDll\Session\ListePersonneSessionActive.vb:line 77
   at System.ComponentModel.ListChangedEventHandler.Invoke(Object sender, ListChangedEventArgs e)
   at System.ComponentModel.BindingList`1.OnListChanged(ListChangedEventArgs e)
   at System.ComponentModel.BindingList`1.InsertItem(Int32 index, T item)
   at QuizzDll.ListePersonneSessionActive.InsertItem(Int32 index, PersonneSessionActive item) in C:\QuizzBox_Solution_Git\QuizzDll\Session\ListePersonneSessionActive.vb:line 86
   at System.ComponentModel.BindingList`1.AddNewCore()
   at System.ComponentModel.BindingList`1.System.ComponentModel.IBindingList.AddNew()
   at System.Windows.Forms.CurrencyManager.AddNew()
   at Telerik.WinControls.Data.RadListSource`1.AddNew()
   at Telerik.WinControls.UI.GridViewNewRowInfo.EndAddNewRow()
   at Telerik.WinControls.UI.GridViewNewRowInfo.OnEndEdit()
   at Telerik.WinControls.UI.GridViewEditManager.FinishEditingOperation()
   at Telerik.WinControls.UI.GridViewEditManager.EndEdit()
   at Telerik.WinControls.UI.GridNewRowBehavior.ProcessEnterKey(KeyEventArgs keys)
   at Telerik.WinControls.UI.BaseGridBehavior.ProcessKey(KeyEventArgs keys)
   at Telerik.WinControls.UI.BaseGridEditor.OnKeyDown(KeyEventArgs keyEventArgs)
   at System.Windows.Forms.KeyEventHandler.Invoke(Object sender, KeyEventArgs e)
   at Telerik.WinControls.RadItem.OnKeyDown(KeyEventArgs e)
   at Telerik.WinControls.UI.RadTextBoxItem.TextBoxControl_KeyDown(Object sender, KeyEventArgs e)
   at System.Windows.Forms.Control.OnKeyDown(KeyEventArgs e)
   at System.Windows.Forms.Control.ProcessKeyEventArgs(Message& m)
   at System.Windows.Forms.Control.WmKeyChar(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.TextBox.WndProc(Message& m)
   at Telerik.WinControls.UI.HostedTextBoxBase.WndProc(Message& message)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
   at QB_Utilisateur.My.MyApplication.Main(String[] Args) in :line 81 ``` 

У меня такая проблема только на х64 офисах (во всех версиях 2010, 2013, 2016, 2019 и 365). Все отлично работает в x86 Office.

Мой проект хорошо настроен (целевая платформа x64) и использует платформу 4.8.

Я пытался установить AccessDatabaseEngine x64 (2010 и 2016), но проблема осталась.

Я пробовал следующие решения:

Попытка прочитать или записать защищенную память. Часто это указывает на то, что другая память повреждена

Попытка чтения или записи защищенной памяти

...не повезло...

в средстве просмотра событий я получаю следующее:

Nom du module défaillant : ACECORE.DLL, version : 16.0.4654.1000, horodatage : 0x5a5f3614
Code d’exception : 0xc0000005
Décalage d’erreur : 0x0000000000067ffb
ID du processus défaillant : 0xe8
Heure de début de l’application défaillante : 0x01d65a8cfcdcdd12
Chemin d’accès de l’application défaillante : C:\Program Files\QuizzBox\QB_Utilisateur.exe
Chemin d’accès du module défaillant: C:\Program Files\Common Files\Microsoft Shared\OFFICE16\ACECORE.DLL
ID de rapport : 35a97517-1ba5-4c8f-89fc-7889842b375a
Nom complet du package défaillant : 
ID de l’application relative au package défaillant : 
XML de l’événement :
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="Application Error" />
    <EventID Qualifiers="0">1000</EventID>
    <Version>0</Version>
    <Level>2</Level>
    <Task>100</Task>
    <Opcode>0</Opcode>
    <Keywords>0x80000000000000</Keywords>
    <TimeCreated SystemTime="2020-07-15T09:48:18.1625753Z" />
    <EventRecordID>6015</EventRecordID>
    <Correlation />
    <Execution ProcessID="0" ThreadID="0" />
    <Channel>Application</Channel>
    <Computer>DESKTOP-FSPFO7H</Computer>
    <Security />
  </System>
  <EventData>
    <Data>QB_Utilisateur.exe</Data>
    <Data>6.2.1.0</Data>
    <Data>5ed6029f</Data>
    <Data>ACECORE.DLL</Data>
    <Data>16.0.4654.1000</Data>
    <Data>5a5f3614</Data>
    <Data>c0000005</Data>
    <Data>0000000000067ffb</Data>
    <Data>e8</Data>
    <Data>01d65a8cfcdcdd12</Data>
    <Data>C:\Program Files\QuizzBox\QB_Utilisateur.exe</Data>
    <Data>C:\Program Files\Common Files\Microsoft Shared\OFFICE16\ACECORE.DLL</Data>
    <Data>35a97517-1ba5-4c8f-89fc-7889842b375a</Data>
    <Data>
    </Data>
    <Data>
    </Data>
  </EventData>
</Event>

person FlorianD    schedule 16.07.2020    source источник
comment
Скомпилируйте с использованием профиля AnyCPU. Убедитесь, что Prefer 32-bit не выбрано при изменении профиля (он может быть выбран повторно, если он был выбран до того, как вы изменили профиль на x64).   -  person Jimi    schedule 16.07.2020
comment
@Jimi: Спасибо за ваш комментарий. Я пробовал, но проблема все еще присутствует.   -  person FlorianD    schedule 16.07.2020


Ответы (1)


Я был здесь, и это настоящий кошмар. В некоторых системах вам, возможно, придется использовать более новый провайдер, например (обратите внимание на 16): "Provider=Microsoft.ACE.OLEDB.16.0;Data source=" & pPathBDD

Что-нибудь еще, чтобы попробовать, "Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=" & pPathBDD

person Jimmy Smith    schedule 16.07.2020
comment
Я уже пробовал первое решение, но оно не работает. Ваше второе предложение работает как шарм. Спасибо - person FlorianD; 17.07.2020
comment
Я рад слышать это! Всегда казалось глупым иметь версии в строках подключения?, также с SQL Server. Иногда я был так разочарован из-за всех SQLNCLI10, SQLNCLI11 и т. д., но в последнее время кто-то в Microsoft, должно быть, прислушался, потому что вы можете использовать новее, Provider=MSOLEDBSQL (которую раньше почти осуждали!) - person Jimmy Smith; 17.07.2020