ストアド実行時のタイムアウト

このQ&Aのポイント
  • ストアド実行時のタイムアウトの原因と解決方法について教えてください。
  • データ抽出クエリを高速化するためにストアドプロシージャを使用していますが、最近タイムアウトのエラーが発生しています。この問題の解決策を教えてください。
  • ビジネスアプリケーションでストアドプロシージャを使用してデータ抽出を行っていますが、タイムアウトの問題があります。どのようにして解決すればよいでしょうか?
回答を見る
  • ベストアンサー

ストアド実行時のタイムアウト

SQL-Server2000,VB6 データ抽出クエリを高速化すべくストアドプロシージャをVBプログラムから起動しています。 以下抜粋 cmd.ActiveConnection = Conn cmd.CommandText = sp_Shukei cmd.CommandType = adCmdStoredProc Set Rs = cmd.Execute 抽出基となるテーブルのレコード件数が大量になったせいなのか、最近以下のエラーが発生するようになりました。 -2147217871(80040e31)[microsoft ] [odbc sql server driver]時間切れになりました いろいろ調べて、プログラムで Conn.CommandTimeout = 0 としてもだめでした。 ストアド自体はReadOnlyですし、トランザクション排他待ちが起きている可能性はありません。 ですのでLOCK_TIMEOUTとは違うと思っています。 単にストアドに記述しているクエリの解釈か実行に時間が掛かっているものと思えるのです。 DB接続自体はこの処理前に何の問題もなく終わっています。 ※実はエンドユーザ環境でのみ発生します。開発環境で同じデータ量で試しても再現しないのです。 エンドユーザのネットワークが遅いのも、ひとつの原因になっているものと思われます。 時間切れを起きなくするにはどうしたらよいのでしょうか? どなたかご存知の方、教えてください。

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

  • ベストアンサー
noname#11722
noname#11722
回答No.1

CommandTimeoutは、それぞれコネクションオブジェクトと コマンドオブジェクト双方にあるので、 コマンドオブジェクトのタイムアウトを設定したらどうでしょうか? cmd.CommandTimeout=0

AnyBody
質問者

お礼

回答ありがとうございます。 試してみます。

関連するQ&A

  • ストアドプロシージャの実行で...

    Test_Pro、というストアドプロシージャを実行させたいんですが、 Microsoft OLE DB Provider for SQL Server エラー '80040e14' ストアド プロシージャ 'Test_Pro' が見つかりませんでした。 というエラーが出てしまいます。どうして??? 実行させる為に書いたソースは、 set cmd = Server.CreateObject("ADODB.command") Set cmd.ActiveConnection = conn cmd.CommandText = "Test_Pro" cmd.CommandType = 4 Set rs = cmd.Execute("@a", a) です。

  • ASPでのMySQLストアドプロシージャの実行

    ASP(Active Server Pages)を使用してMySQLのストアドプロシージャを実行する方法をどなたか教えて頂けますでしょうか? 環境  OS    :Windows2000Server  WEBサーバー :IIS  DB    :MySQL Ver5.1.22 ODBC   :MyODBC Ver3.51 MySQLへの接続は、問題無く行えてそうなんですが ストアドプロシージャの実行がうまくいきません。 ASPには、以下のようなコードを記述しています。 Set cn = Server.CreateObject("ADODB.Connection") cn.ConnectionString = "Provider=MSDASQL;DRIVER={MySQL ODBC 3.51 Driver};SERVER=localhost;USER=root;PASSWORD=XXXX;DATABASE=XXXX;STMT=set names sjis;OPTION=2" cn.Open Set cmd = Server.CreateObject("ADODB.Command") Set rs = Server.CreateObject("ADODB.Recordset") cmd.ActiveConnection = cn cmd.CommandText = "test2" cmd.CommandType=adCmdStoredProc set rs = cmd.Execute ・・・ test2というストアドプロシージャは、 begin select * from テーブル名; end と、単純なselect文となっています。 IEでWEBページを開くと エラー タイプ Microsoft OLE DB Provider for ODBC Drivers (0x80040E14) [MySQL][ODBC 3.51 Driver][mysqld-5.1.22-rc-community]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '{ call test2 }' at line 1 というエラーが表示されてしまいます。 0x80040E14 というエラーコードをネットで調べてみたりしたのですが 構文エラーというような説明が書かれており、何が原因なのか良く分からなく困っています。 何が原因なのか分かる方がいらっしゃいましたら 教えて下さい。

  • ストアドプロシージャの実行について

    asp.net から sqlserver のストアドプロシージャを実行させる勉強をしています。 作成されているはずのストアドプロシージャを実行できずに困っています。 webformにテキストボックス、ボタン、データグリッドを貼り付け、ストアドプロシージャを作成し下記のプログラムを実行させるのですが上手くいきません。 (テキストボックスに任意で入力された数値のデータをボタンを押すと表示するものです) <エラー内容>→ ストアド プロシージャ 'proc1' が見つかりませんでした Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim cn As New SqlConnection Dim cmd As New SqlCommand cn.ConnectionString = "接続文字列" cmd.Connection = cn cmd.CommandText = "proc1" cmd.CommandType = System.Data.CommandType.StoredProcedure Dim p1 As SqlParameter = cmd.Parameters.Add("@param1", System.Data.SqlDbType.Int) p1.Value = TextBox1.Text cn.Open() Dim dr As SqlDataReader = cmd.ExecuteReader DataGrid2.DataSource = dr DataGrid2.DataBind() dr.Close() cn.Close() end sub ストアドproc1(場所:Northwind)の内容↓ CREATE procedure proc1 @param1 int as select * from products where categoryID=@param1 どなたか原因のわかる方がいれば、宜しくお願いします。

  • ストアドプロシージャの戻り値が取得できない

    ストアドプロシージャの戻り値が取得できない ストアドプロシージャ内でSelectとUpdateを行い、設定した戻り値をリターンしたいのです。 ついでにSelectとした複数行の結果の読み込みもしたいのですが。 Dim cmd As New System.Data.SqlClient.SqlCommand Dim i As Integer Dim readerA As System.Data.SqlClient.SqlDataReader cmd.CommandType = Data.CommandType.StoredProcedure cmd.CommandText = "SP名" cmd.Parameters.Add("A", System.Data.SqlDbType.Int) cmd.Parameters("A").Direction = System.Data.ParameterDirection.ReturnValue readerA = cmd.ExecuteReader() i = cmd.Parameters("A").Value if (i = 0) Then 処理 End If While readerA.Read() 処理 End While 上記でSelectした結果をreaderA("カラム名") で読みこめているのですが、戻り値Aの値が取得できていません。 ウォッチ式でcmd.Parameters("A").Valueを見るとNothingになっています。 ちなみに、違うストアドを実行しているところでは戻り値は取得できています。。。 ストアドがおかしいんでしょうか。Selectの取得結果も見ようとしているのがまずいのでしょうか。 環境はvb.net、SQLServer2005です。

  • バッチで実行するVBScriptからのストアドプロシージャの実行

    VBスクリプトでDBにアクセスし、ストアドプロシージャを実行したいのですが、実行できなくて困っています。ADODB.Commandを使わずに、ADODB.Connection.ExecuteでCommandTextを実行するとレコードを取得することができるので、DBにコネクトすることはできているようなのですが、ストアドプロシージャを実行することができません。どなたか原因分かる方いらっしゃいますでしょうか。このスクリプトはASPではなく、バッチで実行します。よって参照設定ができないので、ComandTypeにadCmdStoredProcを値で入れるようにしています。サーバはWindows2003Server,DBはSQLServer2005です。よろしくお願いします。 Option Explicit On Error Resume Next Dim blnRetCode ' 戻り値 Dim objAdoCon ' ADO 接続 Dim objComm ' コマンドオブジェクト 'Dim return_value 'DBバックアップの成功、失敗の戻り値 ' ADO 定数の読み込み Set objAdoCon = WScript.CreateObject("ADODB.Connection") If Err.Number = 0 Then 'ADODBを使用してDBにアクセスする objAdoCon.ConnectionString = "Provider=SQLOLEDB.1;Password=aaaa;User ID=user2;Catalog=dbname;Data Source=192.168.8.2" objAdoCon.Open Set objComm = CreateObject("ADODB.Command") objComm.ActiveConnection = objAdoCon objComm.CommandType = 4 objComm.CommandText = "ExportData" objComm.Execute If (Err.Number <> 0) Then MsgBox Err.Number End If objAdoCon.Close End If Set objComm = Nothing Set objAdoCon = Nothing

  • .NETからストアドプロシージャを実行

    VB.Netからストアドプロシージャを実行するプログラムの書き方がよく分かりません。 データベースはOracleです。 PROCEDURE test(aaa IN number, bbb IN varvhar2, ccc IN OUT varchar2); といったPL/SQLをVB.NET上で実行するとします。 (略:データベースへの接続処理) strSql = "begin test(10, 'テスト', '');end;" 結果「式が割り当てられていません」とエラーが出ます。 すべての引数がINのプロシージャでは、上記の方法で実行できたので、IN OUTへの引数の渡し方に問題があると思うのですが、どうしても分かりません。 まだ使い始めたばかりで、どうしていいかまったく分からない状態です。 どうかご指導お願い致します。

  • ACCESSでストアド

    単純にACCESSでストアドプロシージャ(もどきでも可)は使用出来るのでしょうか?SQL文以外にifやdo等制御構文が使用出来るのか否かを知りたいです。更新クエリ、追加クエリ、削除クエリ等に実装可能なのでしょうか?SQL Server、あるいはOracleで構築したアプリの簡易版としてAccessを使用したものに改変したいと思っておりますが、ストアドをそのままAccessに適用するのは無理だとしても、多少の変更で対応出来るのか否か疑問です。よろしくお願いします。

  • VB.NETでADOでOracleのストアドを起動

    いつも楽しく勉強させていただいております。 環境はWindows Server 2008R2 DataCenter、データベースはOracle10G、開発ツールはVB.NET2015です。 このたびWindows Server 2003のVB6.0から上記の環境に乗せ換えているところです(Oracleのバージョンは変わりなし)。 最初にVB6.0からVB.NETへの変換はかけましたが、 なるべくVBのソースは変更しないという制約があります(テストのし直しが膨大になるので)。 VBとOracleはADOを使って接続しています。 ADOを使ってテーブルの読み書きはできるのですが、ストアドプロシージャの起動がうまくいきません。 具体的には入力パラメータはストアドに渡って処理も動くのですが、出力パラメータが返ってきません。 ストアドが正しく動くことはObjectBrowserで確認済みです。 下記のソースはVB6.0で動いていたものですが、VB.NET2015では二つの出力パラメータの値がNothingとなります。 (本来ならステータスとメッセージが返ります)。 VB.NET2015でADOでストアドを使うことは無理なのでしょうか。 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim Cnn As New ADODB.Connection Dim cmd As New ADODB.Command Dim Prm As New ADODB.Parameter Dim strMsg As String On Error GoTo Err_cmdExec_Click With Cnn .Provider = "MSDASQL" .ConnectionString = "DSN=DB1;" & "UID=abc;" & "PWD=efg" .Open() End With 'ストアドプロシージャ呼び出し設定&呼び出し With cmd .CommandTimeout = 0 'タイムアウト設定を無制限に .ActiveConnection = Cnn 'サーバー接続設定 .CommandText = "CHECK_PROC" 'ストアド名セット .CommandType = ADODB.CommandTypeEnum.adCmdStoredProc 'ストアドなのでadCmdStoredProc Prm = .CreateParameter("p_yyyymm", ADODB.DataTypeEnum.adChar, ADODB.ParameterDirectionEnum.adParamInput, 6, "201601") cmd.Parameters.Append(Prm) Prm = .CreateParameter("p_sts", ADODB.DataTypeEnum.adChar, ADODB.ParameterDirectionEnum.adParamOutput, 1) cmd.Parameters.Append(Prm) Prm = .CreateParameter("p_msg", ADODB.DataTypeEnum.adVarChar, ADODB.ParameterDirectionEnum.adParamOutput, 512) cmd.Parameters.Append(Prm) '実行 .Execute() '戻り値の判断&表示用メッセージ生成 If .Parameters.Item("p_sts").Value = "0" Then strMsg = "正常終了しました" Else strMsg = "異常終了しました" & vbCrLf & "ErrMsg=" & .Parameters.Item("p_msg").Value End If End With Exit_cmdExec_Click: '接続解除 Cnn.Close() 'Set Cnn = Nothing 'メッセージ表示 MsgBox(strMsg) Exit Sub Err_cmdExec_Click: 'ストアド以外の場所でのエラーなので、VBのErrの情報セット strMsg = "異常終了しました" & vbCrLf & "ErrNO=" & Err.Number & " ErrMsg=" & Err.Description Resume Exit_cmdExec_Click End Sub

  • VB6.0でSQLServerへ・・・RecordSet生成タイムアウト・・・

    VB6.0でSQLServer2000へADOで接続して、RecordSetに結果を入れる際に「時間切れ」になってしまいます。コネクションはちゃんとできていて(connection.stateは1)で、 RecordSet.open(SQL文,connection,adOpenForwardOnly,adLockReadOnly)でしばらく待った後「Err.description」で時間切れと言われてしまいます。connection.ConnectionTimeout = 200にしてても時間切れです・・・(涙) でで、SQLServerのlocalhost端末のAccessからSQLServerにリンクをはって同様のSQL文(普通のSelect文です、Joinも副問い合わせとかもしてないです。)をクエリで実行したところ、結果が返ってくるまで15分くらいかかりました。抽出条件にIndexを張ってないため・・・(事情があってIndexはれないです)こういう場合、どのようにしてVBでRecordSetを取得すればいいのでしょうか?ConnectiontimeoutはrecordSet取得時にも有効ですか?そうだとしたら、connectiontimeoutは好きなだけ大きい値を設定してみてよいのでしょうか?

  • SQL サーバーのストアドをAccessのクエリーに変換

    SQL Server 7.0 のストアドプロシージャーをAccess2000のクエリーに 簡単に変換する方法を教えてください。