• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBタイムアウト)

VBタイムアウト

このQ&Aのポイント
  • VB2010で業務アプリケーションの集計ツールを作成しています。タイムアウトの問題とプールサイズの制限値について教えてください。
  • フォーム内のデータグリッドに集計値が入る仕組みで、日付を選択し直すとタイムアウトエラーが発生します。
  • タイムアウトエラー解決の方法や処理のスピードアップ方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

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からの機能です。

red0176
質問者

補足

ありがとうございます。 Using Cnは具体的にこのコードの場合どこに入れればよいのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

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におけるリソース管理の基礎でもあるので, ちゃんと調べておいた方がよいと思います。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

はじめまして通るすがるともうします。わたしははっきりいって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回目より高速い起動されますね!>なので記述しているソースは少し矛盾しているかと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルからSQLの接続の仕方

    エクセルを使ってMSSQLに接続したいのですが、エラーがでて接続できません。 なぜでしょうか? [エラー内容] コンパイルエラー: ユーザー定義型は定義されれいません。 コードの下の部分で発生します。 Dim Cn As New System.Data.SqlClient.SqlConnection [コード] Private Sub CommandButton1_Click() Dim St As String Dim Cn As New System.Data.SqlClient.SqlConnection Dim SQL As System.Data.SqlClient.SqlCommand Dim ServerName As String Dim UserID As String Dim Password As String Dim DatabaseName As String ServerName = "TEST-PC" 'サーバー名(またはIPアドレス) UserID = "sa" 'ユーザーID Password = "password" 'パスワード DatabaseName = "TEST_DB_20140801" 'データベース St = "Server=" & ServerName & ";" & "User ID=" & UserID & ";" & "Password=" & Password & ";" & "Initial Catalog=" & DatabaseName Cn.ConnectionString = St SQL = Cn.CreateCommand SQL.CommandText = "SELECT * FROM LOG_DATA_XLINE" Cn.Open MsgBox (SQL.ExecuteScalar) Cn.Close SQL.Dispose Cn.Dispose End Sub

  • SQLServerデータをDataGridに表示時にエラーが発生

    SQLServerデータをDataGridに表示時にエラーが発生 visual Studio2008を使用し、SQLServerから条件を指定しそれをDataGridに一覧表示するvbを組んでいますが、エラーが解消しなく困っております。対応方法について教えてください。 【状況】 1 Dim St As String 2 Dim Cn As New System.Data.SqlClient.SqlConnection 3 Dim SQL As System.Data.SqlClient.SqlCommand 4 Dim ServerName As String = "Server名"  5 Dim UserID As String = "id" 6 Dim Password As String = "×××" 7 Dim DatabaseName As String = "Dbname" 8 Dim Adapter As New SqlClient.SqlDataAdapter(SQL, Cn) 9 Dim table As New DataTable 10 St = "Server=" & ServerName & ";" 11 St &= "User ID=" & UserID & ";" 12 St &= "Password=" & Password & ";" 13 St &= "Initial Catalog=" & DatabaseName 14 Cn.Open() 15 Cn.ConnectionString = St 16 SQL = Cn.CreateCommand 17 SQL.CommandText = ("SELECT * FROM CUSTOMER_M WHERE CUSTOMER_NAME LIKE " & "'%' & TextBoxName.Text & '%'") 18 Adapter.Fill(table) 19 DataGrid1.DataSource = table 20 Cn.Close() 21 SQL.Dispose() 22 Cn.Dispose() 8行目の「Adapter」がエラーになり、オーバーロードの解決に失敗しましたとメッセージが出ています。8行目の(SQl、Cn)を省くとコンパイルエラーはなくなりますが、14行目でエラーになります。 宜しくお願いします。

  • VB2008フォームのコンボボックスに、MSSQL2008のデータを表

    VB2008フォームのコンボボックスに、MSSQL2008のデータを表示させたい いつもお世話になっております。 以前、VB6を少しかじり、 最近、サンプルコードなどを見よう見まねでvb2008&MSSQL2008について勉強しております。 VB2008で作成したフォームからMSSQLサーバ2008に接続し、 フォームをロードした際、フォーム上にあるコンボボックス(Combobox1)に サーバの指定したテーブル・フィールドの値を表示させたいのですが、 データベースへの接続はできたものの、コンボボックスに表示させる方法がわかりません。 テーブル:社員マスタ フィールド:社員番号 のデータをコンボボックスに呼び出すにはどう処理を加えればよいでしょうか? 今現在、作成中のコードが下記になります。 ご教授お願いします。 Private Sub Frmjob_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'リモート接続に伴うパスを格納 Dim St As String Dim Cn As New System.Data.SqlClient.SqlConnection Dim sqlInsert As New SqlClient.SqlCommand Dim SQL As System.Data.SqlClient.SqlCommand Dim ServerName As String = "192.XXX.X.XX" 'サーバーのIPアドレス Dim UserID As String = "sa" 'ユーザーID Dim Password As String = "bluebird" 'パスワード Dim DatabaseName As String = "testDB" '接続先データベース St = "Server=" & ServerName & ";" St &= "User ID=" & UserID & ";" St &= "Password=" & Password & ";" St &= "Initial Catalog=" & DatabaseName Cn.ConnectionString = St SQL = Cn.CreateCommand 'データベースに接続 Cn.Open() 'サーバから呼び出し SQL = New SqlClient.SqlCommand("SELECT 社員番号 FROM 社員マスタ"'), Cn)     Me.ComboBox1.Items.Add(Item("JobCode")) Cn.Close() SQL.Dispose() Cn.Dispose() End Sub

  • アクセスDbのテーブル名の取得(VB2005)

    再度の質問です アクセスDBのテーブル名を取得したのですが、方法をご教示ください。DAOでは tabledefsでとれたのですが・・ 以下のコードで先に進めません。 OpenFileDialog1.Filter = "アクセス ファイル (*.mdb)|*.mdb" OpenFileDialog1.ShowDialog() If OpenFileDialog1.FileName <> "" Then Dim St As String Dim Cn As New System.Data.OleDb.OleDbConnection Dim SQL As System.Data.OleDb.OleDbCommand Dim UserID As String = "Admin" Dim Password As String = "" Dim MDBFile As String = OpenFileDialog1.FileName Dim N As String = Microsoft.VisualBasic.Right(MDBFile, 9) St = "Provider=""Microsoft.Jet.OLEDB.4.0"";" St &= "Data Source=""" & MDBFile & """;" St &= "User ID=" & UserID & ";" St &= "Jet OLEDB:Database Password=" & Password Cn.ConnectionString = St SQL = Cn.CreateCommand Cn.Open() Dim tbl As DataTable tbl = Cn.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"}) ここでtblを見ると TABLE_CATALOG _SCHEMA _NAME _TYPE ・・・DATE_MODIFIED などは見えるのですが、これがDB内のテーブル数だけ繰り返されます。 取得したいのは、TABLE_NAME に ある 例えば "Pub-ID"に相当する内容なのですが、HELPで探しても、その方法がわかりません、ぜひ教えてください。よろしくお願いいたします。

  • VB2005でACCESSのADO.NETでのテーブル名取得

    VB2005 ACCESSのテーブル名を取得したいのですが、方法をご教示ください。以下のところで悩んでいます。 OpenFileDialog1.Filter = "アクセス ファイル (*.mdb)|*.mdb" OpenFileDialog1.ShowDialog() If OpenFileDialog1.FileName <> "" Then Dim St As String Dim Cn As New System.Data.OleDb.OleDbConnection Dim SQL As System.Data.OleDb.OleDbCommand Dim UserID As String = "Admin" Dim Password As String = "" Dim MDBFile As String = OpenFileDialog1.FileName Dim N As String = Microsoft.VisualBasic.Right(MDBFile, 9) St = "Provider=""Microsoft.Jet.OLEDB.4.0"";" St &= "Data Source=""" & MDBFile & """;" St &= "User ID=" & UserID & ";" St &= "Jet OLEDB:Database Password=" & Password Cn.ConnectionString = St SQL = Cn.CreateCommand    Cn.Open() この後テーブル名までたどり着けません DataTable  Cn.GetSchema Cn.GetOleDbSchemaTable( "restrictions") などヘルプなどから試みていますが、これらのコーディング法がわかりません。 テーブル名がわかっている(サンプルのPubs の "Publisher")場合はデータセットからはフィールド名が取得できたのですが・・・ よろしくお願いいたします。

  • VBExpressからSQLサーバーへの接続

    VBExpress2010をDLしSQLServercompactをいじろうと思ったのですが、接続がそもそも出来ず詰まってしまいました。 適当にフォームを作ってボタンを配置し、 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim St As String Dim Cn As New System.Data.SqlClient.SqlConnection Dim SQL As System.Data.SqlClient.SqlCommand Dim ServerName As String = "C:\Program Files\Microsoft SQL Server Compact Edition\v3.5\Samples\Northwind.sdf"     Dim DatabaseName As String = "Northwind" 'データベース St = "Server=""C:\Program Files\Microsoft SQL Server Compact Edition\v3.5\Samples\Northwind.sdf"";" St &= "integrated security=SSPI;" St &= "initial catalog = Northwind" Cn.ConnectionString = St SQL = Cn.CreateCommand SQL.CommandText = "SELECT FirstName FROM Employees" Cn.Open() MsgBox(SQL.ExecuteScalar) Cn.Close() SQL.Dispose() Cn.Dispose() End Sub としました。結構単純な流れだと思うのですがCn.Open()の部分で「sqlexpressionはハンドルされませんでした」とエラーが出ます。 SQL Network Interfaces, error: 26 だそうです。資格情報の有無もなにもデータベースエクスプローラで内部の閲覧は出来るし、パスワードフリーなのでどのセッションが不可なのか見当がつきません。アドバイスよろしくお願い致します。

  • DB接続文字列の一般的プログラミング方法について

    DB接続プログラムで Dim connectionString As String Dim Cn As New SqlConnection Dim cmd As SqlCommand Dim ServerName As String = "(local)" 'サーバー名(またはIPアドレス) Dim UserID As String = "sa" 'ユーザーID Dim Password As String = "" 'パスワード Dim DatabaseName As String = "ogawaDB" 'データベース connectionString = "Server=" & ServerName & ";" connectionString &= "User ID=" & UserID & ";" connectionString &= "Password=" & Password & ";" connectionString &= "Initial Catalog=" & DatabaseName Cn.ConnectionString = connectionString cmd = Cn.CreateCommand cmd.CommandText = "SELECT id FROM table1" Cn.Open() Debug.Print(cmd.ExecuteScalar) Cn.Close() cmd.Dispose() Cn.Dispose() のデータベース接続プログラムで connectionStringにデータベース接続情報を書くと思うのですが これを各プログラム毎に記述していたのでは変更が生じた場合 管理が大変だと思うのですがこの記述情報をファイルから読みっとったり して対応するのでしょうか。 一般的の接続文字列の管理方法(プログラミング方法)を 教えてください

  • vb2005.netでCrystalReports

    クリスタルレポート初心者です。宜しくお願いします。 以下のソースでクリスタルレポートから印刷を行っていますが、最後にSQLSERVERのパスワード入力のダイアログが出てしまいます。 Dim cn As New SqlClient.SqlConnection Dim cmd As New SqlClient.SqlCommand Dim oDataAdapter As New SqlClient.SqlDataAdapter Dim oDataSet As DataSet = New DataSet Dim oCryRepo As HIJYUU = New HIJYUU cn.ConnectionString = "Server=192.168.1.1;Initial Catalog=TESTDB;ID=sa;Passworsd="pw001;" cn.Open() cmd.Connection = cn cmd.CommandText = "select * from h_tbl where ndate='" & "20110715" & "'" oDataAdapter.SelectCommand = cmd oDataSet.Clear() oDataAdapter.Fill(oDataSet, "H_TBL") oCryRepo.SetDataSource(oDataSet) crView.ReportSource = oCryRepo cn.Close() パスワード入力のダイアログを出さずに印刷する方法を教えていただきたいのですが。 その画面でパスワードを入力すれば正常に印刷されます。 環境はVB2005.NET、それにバンドルされているクリスタルレポート、sqlserver2008です。 以上、宜しくお願い致します。

  • VBでmdbファイルの抽出

    VB6,accessで勉強しています。VBからアクセスファイルを読み込んで sqlで指定したレコードだけ抽出したいのですが、sql実行のところで 「オブジェクトが閉じられている場合は、操作は許可されません」 とエラーが出て出来ません。ご教授お願いします。 Dim cn As New ADODB.Connection Dim rec As New ADODB.Recordset cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=スケジュール表.mdb" Set rec = cn.Execu("SELECT * FROM スケジュール WHERE 日付 = nowdate") Do Until rec.EOF FlexGrid.TextMatrix(i, 0) = rec("開始") FlexGrid.TextMatrix(i, 1) = rec("終了") i = i + 1 rec.MoveNext Loop rec.Close: Set rec = Nothing cn.Close: Set cn = Nothing

  • コンボボックスのSelectedItemの使い方

    エリアテーブルを取得し コンボボックスの見える値は「値」にして コンボボックスを取得するときには「コード」を 取れるようにしたいと思っています。 どのように書くと取得できるのでしょうか? バインドするやり方が分からなくて 下記のようになっています。 Dim strSql As String Dim dr As SqlClient.SqlDataReader = Nothing Dim daAdp As New SqlClient.SqlDataAdapter Dim cmd As New SqlClient.SqlCommand Dim ds As DataSet = New DataSet() mConn = New SqlConnection 'DBのオープン  Conn.DbConnect()   Dim dbCmd As SqlCommand = Nothing 'SQL発行 strSQL = "SELECT コード,値 " strSQL = strSQL & "FROM エリア" Conn.ExecSqlSelect(strSql, dr)   ComboBox1.Items.Clear() Do While dr.Read ComboBox1.Items.Add(dr.GetString(1)) ComboBox1.SelectedItem = dr.GetString(0) Loop