• ベストアンサー

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は好きなだけ大きい値を設定してみてよいのでしょうか?

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

  • ベストアンサー
  • sawagani
  • ベストアンサー率73% (19/26)
回答No.2

SQL発行時であれば、ConnectionTimeoutではなくCommandTimeoutを設定してみてください。秒単位です。

参考URL:
http://www.microsoft.com/japan/msdn/library/ja/jpado260/htm/mdprocommandtimeout.asp?frame=true
usagi_mania
質問者

お礼

ありがとうございます☆ 早速この方法で試してみたところ、15分後くらいに(笑)見事にrecordsetに結果が入ってくれました☆ MicroSoftのHPにはなかなかいいネタがあるんですね☆本当にありがとうございました!!

その他の回答 (1)

  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.1

ADOのオブジェクト変数を宣言する Dim cnn As New ADODB.Connection Dim rec As New ADODB.Recordset cnn.Open ・・ ' 接続を確立する SQLステートメントを指定してレコードセットを作成する rec.Open "select * from テーブル", cnn, _ adOpenKeyset, adLockOptimistic でどうでしょう。

usagi_mania
質問者

お礼

ありがとうございます☆ recordset.open時の引数は全通り試して見ましたが、タイムアウトになってしまいました。 でも、困っているときにアドバイスいただきうれしかったです。本当にありがとうございました。

関連するQ&A

  • VB.NETのConnectionについて

    VB.NET2003でSQLSERVER2000を接続する際に、SQLを発行する毎にConnection確立するのはシステム上負荷が掛かったりしないのでしょうか。 接続方法はADO接続です。

  • 複数のデータベースを検索したい

    困っている内容ですが、 別々のサーバに構築されたAとBというデータベースがあります。 そのAとBにADOによる接続を行いますが、 AとBのテーブルを結合して情報を取得したいと考えています。 SQL文で言うと、 顧客情報はデータベースAに 顧客詳細はデータベースBに存在するテーブルであり 会員IDはそれぞれのテーブルにある SELECT * FROM 顧客詳細 INNER JOIN 顧客情報 ON 顧客情報.会員ID = 顧客詳細.会員ID のようなことがしたいのです。 テーブルを読み込む場合 '' ADO接続オブジェクト Dim adoCon As ADODB.Connection '' 新しいADOレコードセットオブジェクトを作成する Set rs = New ADODB.Recordset '' 読み取り専用でテーブルを開く rs.Open SQL, adoCon, adOpenForwardOnly, adLockReadOnly と書いていまして、adoConの部分が1つのADO接続オブジェクトしか設定できません。 どうにかして2つのデータベースをまたがって 結合できないものでしょうか? 環境は Win2000 + VB6 + SQLSERVER2000 です。 DB初心者なので、説明がうまくいかないと思いますが、 もしおわかりの方がいましたらよろしくお願いします。

  • Recordsetの処理時間について

    現在VC++を用いてSQL Server Express 2005のデータベースに対してSQL文を実行しています。 そこで、下記のような現象が発生し、解決できずに困っています。 [現象] 複数のデータベースが存在する(約300)環境に対して、masterデータベースに接続し、個々のデータベースに対してデータベース名を明示的に記述したSQLを実行。 データベース接続したデータベースと異なるデータベースに対するSQLの処理は1ms~500msと処理時間がばらつきます (SQL文はSELECT data1 FROM Db1.dbo.table1 where data1=1;という感じで各テーブルには約3000レコード、SQLの結果は300件程度。Recordset Openメソッドの引数はCursorType:adOpenForwardOnly,Options:adLockReadOnly,LockType:adCmdTextです。)。 まったく同一のSQL文なので、データベース接続後、1回目は時間がかかるのは理解できますが、それ以降の処理を連続で繰返しているだけなので2回目以降処理時間が大きくばらつくことが不明です。 これは同一データベースに対して繰返しても、別々のデータベースに対して繰返してもほぼ同様の現象が発生します。 [確認したこと] - Windows認証、SQL Server認証いずれにおいても同様の傾向。 - 自プロセスあるいは他プロセスからターゲットとなるデータベースに先に接続した状態のままで実行すれば、処理時間のばらつきが1ms~80ms程度 本来、データベース毎に接続-->SQL実行-->解放を繰返せばよいのですが、Vistaにおいてはメモリリークが発生するため、この方法は採用できません。 現状、別プロセスでSQL文を実行するデータベースだけ、先に接続し、処理が完了すればこのプロセスを終了することで回避を考えているのですが、この方法では、SQLServerの負荷をかけてしまうため、よりよい方法が無いか教えてください。 よろしくお願い致します。

  • recordsetが取得できなかった場合

    Access2003のVBAについて質問です。 recordsetが取得できなかった場合、どういった値が返されるのでしょうか? やりたい事は、recordsetが取得できた時、できなかった時でメッセージの表示を変えたいです。 ご教授よろしくおねがいします。 Public Sub Exsample() Dim CN As ADODB.Connection Dim RS As ADODB.Recordset Dim SQL As String '接続 Set CN = CurrentProject.Connection 'レコードセットを取得 Set RS = New ADODB.Recordset SQL = "SELECT * FROM 生徒名簿 WHERE クラス = 'TS'" RS.Open SQL, CN, adOpenKeyset, adLockOptimistic

  • VB6とSQL SERVER 2005のADO接続方法

    VB6とSQL SERVER 2005(Developer Edition)のADO接続方法がわかりません。 今までSQLSERVER2000で開発していたのですが、DBをSQLSERVER2005に 変更したところ接続できませんでした。 以下はSQLSERVER2000時のソースなのですが、 2005の場合ConnectionStringはどうやればいいのでしょうか? --------------------------------------- Dim rs As ADODB.Recordset Dim cn As ADODB.Connection Set rs = New ADODB.Recordset Set cn = New ADODB.Connection cn.ConnectionString = "Provider=SQLOLEDB.1;" & _ "User ID=" & strUsr & ";" & _ "Data Source=" & strSvr & ";" & _ "Password=" & strPass cn.CursorLocation = adUseClient cn.Open --------------------------------------- 初歩的な質問で申し訳ありませんがどなたかお助けください。

  • VBAからaccessへの接続で、RecordsetのCursorTypeが勝手に変更される

    エクセルVBAからaccessへの接続で、RecordsetのCursorTypeが勝手に変更されてしまいます。 Dim rst As New ADODB.Recordset rst.CursorType = adOpenStatic と「adOpenStatic」に設定したいのですが、 Set rst = con.Execute(sql_str, , adCmdText) のようにクエリを実行した直後にCursorTypeを調べると、「adOpenForwardOnly」に変わってしまっています。 (設定直後に調べると、ちゃんとadOpenStaticになっています) 「CursorType」を何に設定しても、Execute直後に「adOpenForwardOnly」になってしまっていまうようです。 CursorTypeをadOpenStaticにして、RecordCountを使いたいのですが、、、 CursorTypeが変わってしまう原因をお知りの方は、教えていただけるとありがたいです。 Dim rst As New ADODB.Recordset Dim con As New ADODB.Connection con.Open "Provider=Microsoft.jet.OLEDB.4.0;" & "Data Source=" & ThisWorkbook.Path & "\" & mdb_file & ";" rst.CursorType = adOpenStatic rst.LockType = adLockReadOnly MsgBox "前 = " & rst.CursorType Set rst = con.Execute(sql_str, , adCmdText) MsgBox "後 = " & rst.CursorType

  • VB6(ADO)=>SQLSERVER2000アクセス時のエラーコードの意味?

    VB6でADOと使用してSQLServer2000にアクセスしています。 以下のエラーが発生します。 -2147217871(80040031) 日本語のメッセージは別の場所で発生したので不明です。 よく-2147467259(80004005)時間切れになりました。 というメッセージはでますが、それとはコードが異なります。 教えていただきたのは、上のメッセージコードからその意味を知るには どのマニュアル(SQLServer2000のBOOKSOnlineのどの箇所?)をみれば 書いてあるのかということです。 ご存知の方お願いします。

  • VBScriptからストアドプロシージャのOUT変数の取得について

    SQLServer2000上でOUT変数によって戻り値を呼び出し元に返すストアドプロシージャを作成し、VBScriptから実行したいと思っていますが、OUT変数上の戻り値を取得する方法がわかりません。 ADO経由でselect文の結果をrecordsetとして取得するメソッドは用意されているようなのですが、OUT変数として取得する適当なメソッドがVBScriptには見つかりませんでした。 同じようなことを行ったことのある方がいらっしゃいましたらやり方を教えて頂けますでしょうか。

  • SQLの結果を更に絞り込む

    ADOのRECORDSETをSQLのSELECT文で抽出します。 そのRECORDSETに対して更にSQLをかけることは出来るのでしょうか? やりたいことはキーワード検索した結果に対して更に 別のキーワードで絞りこむといったことなのですか。 よい方法がありましたら教えてください。

  • SQLServer2000で。

    こんにちは。早速質問させて頂きます。 VB6.0からSQLServer 2000に、ADOで接続を行っています。 デ-タ更新時に、デ-タ単位でロックをかけたいのですが、どのように記述すればよいのか分かりません。 SELECT文だと、テ-ブル名の後ろに【WITH~】と記述するというのは分かったのですが、INSERT/UPDATE/DELETEの際はどのようにすればいいのでしょうか? もう一つ。 デ-タSELECT時に、項目にNULL値が入っていた場合、NULL以外の値で取得する方法はありますか?(Oracleにはあったような…) どなたか知識のある方、教えて下さい。 よろしくお願いします。

専門家に質問してみよう