Как отловить исключение параллелизма для общей локальной базы данных (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

но я не знаю, что это то, что я ищу и как это использовать.

0 ответов

Другие вопросы по тегам