2015-12-23 1 views
0

Я пытаюсь исправить небольшую утилиту, которая, кажется, теряет соединение с базой данных после некоторого простоя. Я уже установил таймаут в 0, но это, похоже, не сработало.VB6 ADODB.Connection Execute() Повторить попытку до успешного завершения

Вместо простого сбоя и отображения нескольких сообщений об ошибках я хотел бы попытаться восстановить соединение и выполнить запрос до успешного (я понимаю, что это, вероятно, плохое использование ресурсов), но даже тогда это то, что я Я пытаюсь это сделать. Или, если возможно, отобразите Message Box, в котором указано, что соединение было потеряно, которое затем будет закрыто после установления соединения.

Любые предложения были бы весьма полезными.

Public connMain As ADODB.Connection 
Public rsMain As ADODB.Recordset 

...... 

Function Picture_Exists() As Boolean 
On Error Resume Next 
sqlstr = "select * .... " 
Set rsMain = connMain.Execute(sqlstr) 
+0

Некоторые неудачи (возможно, большинство) никогда не может быть успешным, так что бы бесконечный цикл. – Plutonix

+0

Пожалуйста, укажите весь запрос SQL, а также часть кода на ваш вопрос. –

ответ

0

Возможно, ваше соединение удалено в конце базы данных из-за неиспользования. Не рекомендуется поддерживать соединение, когда оно не используется; соединения являются дорогостоящими с точки зрения ресурсов, поэтому любая такая практика не будет хорошо масштабироваться. Dbadmins вряд ли оставят неиспользуемые соединения открытыми очень долго.

Ваше потенциальное решение говорит о попытке подключения и если вы не можете игнорировать ошибку. Мы не говорим «никогда» в этом бизнесе очень часто, но вы никогда не должны использовать «On Error Resume Next», не вычисляя также Err.Number, чтобы определить, равно ли оно 0 (если это так, нет ошибки). Это называется «встроенной обработкой ошибок».

В любом случае, я бы не использовал этот метод. Я бы оценил объект Connection State Property, и если он закрыт (cn.State = adoStateClosed), я снова его открою.

0

Вы можете попробовать следующее:

On Error Resume ''''instead of On Error Resume Next 

Dim rsMain As New ADODB.Recordset 
sqlstr = "select * .... " 
If rsMain.State = adStateOpen Then rsMain.Close 
rsMain.Open sqlstr, sProvider, adOpenKeyset, adLockOptimistic