Проверьте, доступна ли веб-база данных Access - PullRequest
0 голосов
/ 05 января 2012

Есть ли способ проверить, доступна ли онлайн-база данных Access?Я подключаюсь к базе данных через OleDB и провайдера Microsoft.ACE.OLEDB.12.0.База данных содержит локальные таблицы, а также некоторые веб-таблицы.Мне нужно иметь возможность проверить, подключены ли веб-таблицы к базе данных SharePoint.Я также использую библиотеку Access Interop для выполнения некоторых действий - если я могу использовать это для проверки работоспособности базы данных, это тоже работает.

Ответы [ 2 ]

1 голос
/ 06 января 2012

Клиент Access знает, находится ли он в режиме «on» или «off line». Таким образом, должен быть способ, которым Access проверяет / проверяет / знает, что эти таблицы в настоящее время отключены (локально) или фактически имеют прямое соединение с SharePoint и активно синхронизируют данные. Мое чувство паука говорит мне, что этот статус может быть не раскрыт, и если это так, я не знаю, как получить это значение.

Однако вы можете попытаться выполнить полную операцию веб-синхронизации, и если вы отключены от сети, вы получите ошибку (3021). Это кажется чем-то вроде клуджа, и вполне возможно, что статус можно проверить (но я не знаю, как на данный момент).

Так что попытка синхронизации вызовет эту проблему.

например

On Error Resume Next
DoCmd.RunCommand acCmdSyncWebApplication
Debug.Print Err.Number

Как правило, константа acCmdSyncWebApplicaiton равна 699 ​​

Однако вышеприведенное фактически выдает диалоговое окно, которое должно быть закрыто. Так что выше, это нормально для кнопки взаимодействия с пользователем, но НЕ для взаимодействия или автоматизации без взаимодействия с пользователем.

Единственный способ узнать, как это сделать прямо сейчас из Access, - это вызвать процедуру на уровне таблицы в SharePoint.

Для меня неплохо работает следующее:

On Error Resume Next
DoCmd.RunDataMacro "tblmonthtext.test1"
Debug.Print Err.Number

Если мы находимся в режиме онлайн и таблицы подключены, то вызов процедуры на уровне таблицы (она ничего не делает) работает нормально, и errnumber = 0. Если мы находимся в автономном режиме, то вызов процедуры таблицы невозможен, и, следовательно, ошибка номер = 13087.

Как уже отмечалось, поскольку мы имеем дело с автоматическим соединением или отключением таблиц, тогда мой код VBA, открывающий таблицы, работает нормально, независимо от того, подключено ли вы к сети или приложение работает в автономном режиме, а не в режиме онлайн. , Я не думаю, что код знает или заботится, и это большая ваша проблема.

Так что я могу вызвать эту табличную процедуру из Access. Я полагаю, что объект и методы docmd предоставляются в виде автоматизации (взаимодействия) .net, поэтому на данный момент я использую этот kluge, и он работает для меня довольно хорошо. Если выставлен rundatamacro, вы можете использовать эту идею.

Еще один ключ (тот, который вам больше подойдет) должен использовать фиктивную таблицу и добавить новую запись. Когда таблицы находятся в автономном режиме, сгенерированное значение PK автономера равно отрицательным значениям. Когда вы, наконец, подключены к сети и выполняете синхронизацию, эти отрицательные числа PK заменяются сгенерированными положительными значениями PK на стороне сервера.

И когда вы в сети и добавляете строку, вы получаете положительное значение автонумера PK. Итак, еще один возможный трюк - просто иметь фиктивную таблицу без записей.

Затем вы просто добавляете запись, убедитесь, что она сохранена. Затем вы берете значение pk, а затем, я полагаю, просто удалите строку. (поэтому таблица никогда не заполняется). Если значение pk> 0, вы подключены к сети. Если значение PK <0, то вы находитесь в автономном режиме. Таким образом, одна «подсказка» или идея находится в автономном режиме. Значения строки PK будут заменены, когда вы, наконец, получите соединение с синхронизацией, и в течение этого периода времени эти значения PK будут <0. </p>

0 голосов
/ 06 января 2012

Как насчет чего-то вроде

try
{
   //Create or open connection
}
catch(/*Exception you receive if database is inaccessible*/)
{
   //Handle exception
}
catch(Exception ex)
{
   //Handle other exceptions
}
finally
{
   accessConnection.Close();
}
...