Соединение с базой данных sql server потеряно в приложении vb6 после того, как компьютер переходит в спящий режим - PullRequest
1 голос
/ 24 января 2012

У меня есть старое приложение Visual Basic 6, когда некоторые пользователи сообщали мне об ошибках при выходе компьютера из спящего режима.Эта проблема не возникает на каждом клиентском компьютере (я бы сказал, некоторые Windows 7).Если приложение vb6 было по-прежнему открыто, то при попытке использовать это приложение оно вылетает со следующим сообщением об ошибке.

enter image description here

Я отладил и обнаружил проблему: у меня есть глобальныйпеременная, которая поддерживает соединение с базой данных.Эта переменная инициализируется только один раз в начале приложения.Когда компьютер переходит в спящий режим и возвращается обратно несколько раз, состояние этой переменной остается «ОТКРЫТО», но на самом деле соединение потеряно!Если я "ЗАКРЫТЬ", а затем "ОТКРЫТЬ" это переменное соединение, я могу запросить базу данных.

Интересно, нормально ли это, что я потерял соединение с базой данных?!

Вот код:

 ' This is my global variable
 Global cn As New ADODB.Connection

 ' Set connection properties for sql server.
 cn.ConnectionTimeout = 25
 cn.Provider = "sqloledb"
 cn.Properties("Data Source").Value = ".\SQL2008"
 cn.Properties("Initial Catalog").Value = DB_INITIAL_CATALOG
 cn.Properties("User ID").Value = DB_USERNAME
 cn.Properties("Password").Value = DB_PASSWORD
 cn.Open

 ' This is a typical query on my database
 Set rs = New ADODB.Recordset
 strSql = "SELECT * FROM tblUsers"
 rs.Open strSql, cn, adOpenKeyset

Есть идеи?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 24 января 2012

Да, я видел подобные вещи раньше. В строке подключения могут быть параметры, которые могут помочь уменьшить его, но тайм-ауты и / или потери в сети могут нарушить базовое (часто TCP) соединение с сервером БД. Затем вы увидите ошибку, проявленную в следующем вводе-выводе в базу данных.

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

'Open is called to set the args to connect, these should be saved for reconnect
Public Sub Open(connect params here)

    'save arsg to prive members to reconnect

    'connect to db

End Sub

Public Function OpenKeyset(sql) As RecordSet

   Set rs = New ADODB.Recordset  

   On Error Resume Next
   rs.Open strSql, privateConn, adOpenKeyset

   'if the error is the disconnect
   If Error.Number = xxx Then 'or inspect the error message or error collection

      'turn of error trap
      Err.Clear
      On Error Goto 0

      'reopen db conn

      'then retry
      rs.Open strSql, privateConn, adOpenKeyset

   End If

   OpenKeyset = rs

End Function

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

0 голосов
/ 29 апреля 2016

Вы должны перехватывать события сна и пробуждения в своем коде vb6, любые длительные запросы должны быть закрыты во время сна, чтобы соединение дБ могло быть закрыто.На след вы делаете противоположное.Вам необходимо прослушать сообщение WM_POWERBROADCAST. https://msdn.microsoft.com/en-us/library/windows/desktop/aa373247(v=vs.85).aspx

Удачи, Jeppe

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...