- ベストアンサー
VBタイムアウト
- VB2010で業務アプリケーションの集計ツールを作成しています。タイムアウトの問題とプールサイズの制限値について教えてください。
- フォーム内のデータグリッドに集計値が入る仕組みで、日付を選択し直すとタイムアウトエラーが発生します。
- タイムアウトエラー解決の方法や処理のスピードアップ方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
Return以後のコードは実行されませんよ。 このコードだと,作成したSqlConnectionがGCされるまで開きっぱなしになります。 その結果,接続数が増えすぎてエラーになっているのだと思います。 SqlConnectionとSqlCommandを作る時に,Usingブロックを使ってみてください。 これにより,正しくDisposeが呼び出され,接続が閉じられるようになります。 e.g.) Using cn = New SqlConnection() Using cm = New SqlCommand() ' .... End Using End Using これは, Dim cn As SqlConnection = Nothing Try cn = New SqlConnection() Dim cm As SqlCommand = Nothing Try cm = New SqlCommand ' ... Finally If cm IsNot Nothing Then DirectCast(cm, IDisposable).Dispose() End Try Finally If cn IsNot Nothing Then DirectCast(cn, IDisposable).Dispsoe() End Try とほぼ等価で,Usingブロックを出たタイミングでDisposeを呼び出してくれます。 # VB2005からの機能です。
その他の回答 (2)
- Yune-Kichi
- ベストアンサー率74% (465/626)
ANo.2です。 元のコードから無駄をそぎ落としつつUsingを使うなら, Function CONNECT(ByVal SqlText As String) As String Dim Builder = New SqlConnectionStringBuilder() Builder.DataSource = "AAAAAAAAA" Builder.UserID = "BBBBBBBBB" Builder.Password = "CCCCCCC" Builder.InitialCatalog = "DB" Using Cn = New SqlConnection(Builder.ConnectionString) Using SQL = New SqlCommand(SqlText, Cn) Cn.Open() Return TryCast(SQL.ExecuteScalar(), String) End Using End Using End Function という感じになると思います。 UsingブロックはVisual Basicにおけるリソース管理の基礎でもあるので, ちゃんと調べておいた方がよいと思います。
- ToOrisugaru
- ベストアンサー率28% (80/280)
はじめまして通るすがるともうします。わたしははっきりいってADOは使ったことはないのですが(環境もないし)、基本的にDBの使用法として(1)でopn (2)sql発行 (3)close(Disconect)の手順で行うとおもうのですが、上記ソースの部分で以下の疑問があります。 0.上のソース 1. Cn.Open() <-dbへの接続 2.Return SQL.ExecuteScalar <-sql発行 3.SQL.Connection = Nothing 4.SQL.Transaction = Nothing 5.SQL.Dispose() 6.Cn = Nothing 7.Cn.Dispose() 8.Cn.Close() <- ここでクローズ?? (dbのdisconect?) だとすると、8行目のまえに5行目から6行目ででインスタンス解放初期化していては8行目で何をクローズすればいいのか判断できないと思います(多分ここでタイムアウト?)。なので8行目は2行目の直下に書くべきでは? あと、このソースの部分は同じ接続内容で連続して呼ばれるわけですよね? だとするとわざわざ初期化(5行目から7行目)する必要ってあるのでしょうか?たとえ使用しなくなってもせっかくメモリに常駐されたのなら次に接続を要求したときにすでにメモリに常駐したところを使用しにいくと思うので記述しないほうが早く動作すると思います。もし、確実にメモリを解放し解放したところを確実に使用できるようにしたければ8行目の後に、ガベージコレクションを起動しなければならないと思います。(System.GC.Collect)。<例をあげるのならたとえば、EXCELを一度目立ち上げると2回目に立ち上げたときは1回目より高速い起動されますね!>なので記述しているソースは少し矛盾しているかと思います。
補足
ありがとうございます。 Using Cnは具体的にこのコードの場合どこに入れればよいのでしょうか?