プロが教える店舗&オフィスのセキュリティ対策術

DBへのOPENについて

無限ループの処理の中でDBへ取得、更新をします。
無限ループの中で毎回Openするのはいけてないと思うので、例外などに入ったときのみCloseしてあとはOpenのままでいたいと思っています。
つまりCloseされていたらOpenするという処理をしたいのですがどうやったらいいのでしょうか。

↓無限ループしている箇所からの呼び出し
Public Sub AA ()
Dim cn As System.Data.SqlClient.SqlConnection
Dim ServerName As String = "AA"
Dim DBName As String = "BB"
try
cn = New System.Data.SqlClient.SqlConnection
If cn.State = Data.ConnectionState.Closed Then
cn.ConnectionString = "Data Source = " & ServerName & _
";Initial Catalog = " & DBName & _
";Integrated Security = SSPI"
cn.Open()
End if
Catch ex As Exception
cn.close()
End try
End Sub

こんな感じかなと思いましたが、これだと毎回Newしているのでなにかおかしい気がしてしまいます。

環境
SQL Server2008
ADO.net
VB.net

A 回答 (3件)

無限ループする前にオープンして、無限ループを抜けた後にクローズしてください。


何で無限ループの中でオープン、クローズ処理を行おうとしているのかが理解できません。
なお、catchの中でコネクションをクローズする際には、コネクションが生成されているかどうか判定した上で、コネクションが生きている場合だけクローズするようにしましょう。

この回答への補足

回答ありがとうございます。
処理に障害が発生しても処理が止まる事がないようにしたいのです。
なのでオープン処理をループ内にいれて、なにかあってもまたオープンする処理を入れたかったのですが。

補足日時:2010/04/03 13:29
    • good
    • 0

単純に考えて、「Openフラグ立ておいて判定」は不可?

この回答への補足

回答ありがとうございます。
フラグを用意しなくても、コネクションの状態でわかりませんか?

補足日時:2010/04/03 13:31
    • good
    • 0

>処理に障害が発生しても処理が止まる事がないようにしたいのです。



SQLエラーが発生したからって、勝手にコネクション切れたりしませんが・・・
try~catchの中でSQL発行して、エラーが起きたら、catchの中で適切なエラー処理を行って、呼び出し元へきちんと処理を返せば良いだけですよね。

なので、エラーが起きても続行する事と、コネクションを操作する事に関連性はありませんよね。


まぁ、貴方のやり方で言うなら、cnをグローバルに取るなり、その関数の呼び元で生成して引数で渡して来るなりして、オブジェクト自体は呼び元で生成。
こちらの関数内では、openとcloseだけを行う。
オブジェクトの破棄は、再度呼び出し元で。
とでもやれば、貴方の思っているようなのが出来るのでは?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!