2010-06-16 3 views
0

Есть ли способ написать крюк, который будет запущен до того, как изменения будут переданы в БД доступа? Я ищу способ заблокировать изменения, если конкретный процесс в настоящее время запрашивает БД.Блок, вносящий изменения в базу данных Microsoft Access

+0

Вы пытались запустить определенный процесс с эксклюзивным доступом к базе данных? Это помешало бы другим процессам изменять БД во время его работы. –

+0

Ну, «конкретный» процесс представляет собой набор сценариев развертывания, который вычисляет определенную информацию из базы данных. Но если база данных будет изменена в середине выполнения развертывания, все будет отключено. Я слышал о том, что только чтение db или определенных таблиц может быть выполнено программно из сценариев развертывания, а затем снова включено после завершения развертывания? –

+0

Вы не можете сделать db только для чтения, но вы можете определить, что ваше соединение является эксклюзивным. Как это сделать, зависит от того, как вы получаете доступ к базе данных Jet/ACE (ODBC, ADO/OLEDB). –

ответ

1

Вы не дали нам много информации для работы. Можете ли вы адаптировать что-то вроде Create and Use Flexible AutoNumber Fields так конкретный процесс сначала открывает таблицу исключительно? Тогда любые другие операции, которые могут изменить данные, должны были ждать, пока они не смогут заблокировать эту же таблицу.

Что такое специфический процесс? У вас есть способ определить, когда/если он считывает данные из вашей базы данных?

Если специфический процесс является внешним по отношению к базе данных, например ASP-код веб-сервера, который использует ADO для извлечения данных, вы можете увидеть, могут ли быть полезны свойства ADO connection и IsolationLevel.

Обновление: Я использовал форму для экспериментов с свойством adModeShareDenyWrite Mode для соединения ADO. Пока форма открыта, другие пользователи могут открывать базу данных, но не вносить никаких изменений. Однако, если другой пользователь уже открыл db, когда форма пытается открыть соединение, он вызывает ошибку.

Возможно, ваш сценарий развертывания может попытаться открыть соединение adModeShareDenyWrite и выполнить ошибку при ошибке.

Option Compare Database 
Option Explicit 
Dim cn As ADODB.Connection 

Private Sub Form_Close() 
    If Not (cn Is Nothing) Then 
     cn.Close 
     Set cn = Nothing 
    End If 
End Sub 

Private Sub Form_Load() 
    Set cn = New ADODB.Connection 
    cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
     "Data Source=\\Cmpq\export\Access\backend\links2003.mdb;" & _ 
     "User Id=admin;Password=;" 
    cn.Mode = adModeShareDenyWrite 
    cn.Open 
End Sub 
+0

Посмотрите на мой комментарий к OP –

 Смежные вопросы

  • Нет связанных вопросов^_^