Как отловить исключение параллелизма для общей локальной базы данных (SQL Server Compact | .sdf) в Visual Basic?
Я пишу программу, которая позволяет двум пользователям получать доступ к одной и той же локальной базе данных (.sdf) в общей папке. База данных состоит из задач для сотрудника. Один пользователь (Master) добавляет и редактирует эти задачи, другой (Slave) помечает их как выполненные / отмененные и обновляет список.
Двое из них должны быть допущены к работе одновременно. Т.е. Мастер добавляет новую задачу, Раб завершает одну задачу, обновляет список и немедленно находит новую.
Когда выполняется запрос к базе данных, создается экземпляр модуля, который открывает базу данных, выполняет SQL-запрос (Выбрать, Обновить, Удалить, ...) и закрывает его. Вот так выглядит модуль VB:
Public Sub ExecQuery(Query As String)
Try
SQLCon.Open()
SQLCmd = New SqlCeCommand(Query, SQLCon) 'Create SQL command
' Load Parameters into SQL Command
Params.ForEach(Sub(x) SQLCmd.Parameters.Add(x))
Params.Clear() ' Clear Parameter List
' Execute Command, Fill Dataset and close database
SQLDS = New DataSet
SQLCon.Close()
Catch ex As Exception
Exception = ex.Message
End Try
If SQLCon.State = ConnectionState.Open Then SQLCon.Close()
End Sub
Если надо признать, что я взял фрагмент кода из учебника.
Теперь обновление DataGridView будет выглядеть так:
Public Sub GetEntry()
Dim ii As Integer = 0
grdData.Rows.Clear() 'empty GridDataView
SQL.ExecQuery("SELECT * FROM Tasks)
grdData.Rows.Add(n)
For Each r As DataRow In SQL.SQLDS.Tables(0).Rows
grdData.Item(0, ii).Value = r(0)
grdData.Item(1, ii).Value = r(1)
grdData.Item(2, ii).Value = r(2)
' ...
ii += 1
Next
If SQL.Exception <> "" Then
MsgBox(SQL.Exception)
End If
End Sub
Проблема в том, что когда Master и Slave оба выполняют команду SQL.ExecQuery(String), они получают доступ к одному и тому же файлу.sdf, что не должно быть возможным, верно? Я ожидал что-то вроде "Не могу открыть database.sdf, так как в данный момент к нему обращается другой пользователь". Затем я хотел бы позволить сценарию подождать одну секунду и повторить попытку. Но вместо этого я получаю "Ошибка: Индекс вне диапазона". Поэтому я предполагаю, что код пытается прочитать все записи, но не может.
Кто-нибудь знает, как поймать это исключение? Я читал о
Data.DBConcurrencyException
но я не знаю, что это то, что я ищу и как это использовать.