2012-01-24 22 views
1

コンピュータがスリープから復帰したときにエラーを報告した古いビジュアルベーシック6アプリケーションがあります。この問題は、すべてのクライアントコンピュータで発生していませんでした(Windows 7と言います)。 vb6アプリケーションがまだ開いていて、このアプリケーションを使用しようとすると、次のエラーメッセージが表示されてクラッシュします。コンピュータがスリープ状態になった後にvb6アプリケーションでSQL Serverデータベースが失われる

enter image description here

私がデバッグ、私は問題を発見した:私は、データベースへの接続を維持するグローバル変数を持っています。この変数は、アプリケーションの開始時に1回だけ初期化されます。コンピュータがスリープ状態になり、後で何度か前に戻ると、この変数のステータスは「OPEN」ですが、実際には接続が失われています。この変数接続を「閉じる」してから「開く」とすると、データベースに問い合わせることができます。

私はデータベース接続を失ったのが普通かと思いますか?

' 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 

任意のアイデア:ここ

はいくつかのコードですか?

ありがとうございました。

答えて

3

はい、以前はこのようなことがありました。接続文字列を減らすのに役立つ設定があるかもしれませんが、タイムアウトやネットワークドロップは、基礎となる(しばしばTCP)接続をDBサーバーに壊す可能性があります。次に、データベースへの次のI/Oでエラーマニフェスト自体が表示されます。

共有接続へのアクセスをラッピングすることで、その特定のエラーを透過的にキャッチして再試行することをおすすめします。クラスやモジュールでプライベート接続を維持し、のような方法があります:あなたも、定期的に再接続ライブとproactivle接続を維持するためにカタログまたは何をキシにのようなノーオペレーションのDB操作を行うことができ

'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

感謝。私はこの種の問題が起きるのは奇妙に思えるのですか?私はそれほどエレガントなものではないと思うし、もっとプロフェッショナルな解決策があることを願っています。私の「一時的な」解決策はあなたのソリューションからあまり離れていません.dbを照会する前に、私はdbを偽装します。特定のエラーで失敗した場合は、db接続を閉じてrepoenします。 – Bronzato

+0

コンピュータがスリープ状態になると、いつでもTCP/IP接続が切断されます。壊れた接続を確認して修復するのは、それを使用するソフトウェアによって異なります。これは珍しいことではありません。 –

0

vb6コードでスリープおよびウェイクイベントをトラップする必要があります。長時間実行されているクエリはスリープ時に閉じて、dB接続を閉じることができます。目を覚ますと、あなたは逆のことをします。あなたは WM_POWERBROADCASTメッセージを聞く必要があります。 https://msdn.microsoft.com/en-us/library/windows/desktop/aa373247(v=vs.85).aspx

幸運あなたの応答のための ジャップ

関連する問題