CRecordset時における時間切れについて – プログラミング – Home

CRecordset時における時間切れ...
 
通知
すべてクリア

[解決済] CRecordset時における時間切れについて


おっか
 おっか
(@おっか)
ゲスト
結合: 22年前
投稿: 34
Topic starter  

はじめまして
最近、VC++をはじめたばかりの”おっか”と申します。
開発環境は
Win2000, VC++6.0, MFC, SDI,MS SQL7.0の環境です。

私はいま、VC++によるODBC接続のによる
MS SQLのデータ抽出の作業に取り掛かろうとしている
ところなのですが、レコード数の少ないものは問題ないの
ですがレコード数の多いもの(100万件)に関しては、
CRecordsetにおいて時間切れとなってしまいます。
どのように対処すれば良いかお手数ですが
ご教授頂けますでしょうか。
また、あるところではCommandTimeoutを使うと良いと
書いてあったところもあったのですがその使い方も
よく分かりませんでした、他にも方法がございました
らご教授頂ければ幸いです。
ソースは下記をご参照ください。

CString strCon;
CString strSql;
strCon = DSN=testdb;UID=sa;PWD=test;
strSql = select * from dbo.wkskf13;
CDatabase db;
//接続
db.OpenEx( _T( strCon ), CDatabase::openReadOnly | CDatabase::noOdbcDialog );
//実行
CRecordset rs( &db );rs.Open( CRecordset::forwardOnly, _T( strSql ) );


引用未解決
トピックタグ
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

>CommandTimeout
はADOには有効のようですね
ご質問なさっているODBCには定義できないのでは?

今のコードに追記して有効かなと思えるのは
CRecordset::useMultiRowFetch
と思えます
RFXの扱いが変わるようですけど

また、データ条件は絞れないのですかね?

このコード記述だと
VC(アプリ)→ODBC→SQL7→コンパイル(文法解析)→実行→結果
→SQL7→ODBC→VC(アプリ)のステップ(一部割愛)
で実行されると思いますが

ストアドプロシージャ使うことを考えてみてはどうでしょうか
もう少し選択肢広がるのではないですか

私も大量データこそ扱っていませんがWin XPで
同じような環境で開発を行っています


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

CDatabase::SetLoginTimeout()とか、
CDatabase::SetQueryTimeout()という関数がありますけど、
これでタイムアウトを長くしてみてはどうでしょう。


返信引用
おっか
 おっか
(@おっか)
ゲスト
結合: 22年前
投稿: 34
Topic starter  

woodさん、早速のご回答有難うございます。

早速、試させて頂きました

下記のようにソースを変更しましたが
やはり、時間
rs.Open( CRecordset::snapshot, _T( strSql ),CRecordset::readOnly |
CRecordset::useMultiRowFetch);
として行いなましたが、まだ”時間切れなりました”となってしまいました。

時間切れになる時間を長くする方法はなにか無いものでしょうか。
お忙しいなか、ご回答いただきまして申し訳ございませんが、
その他、事項、C++での解決方法がございましたらご回答頂ければ
幸いです。


返信引用
おっか
 おっか
(@おっか)
ゲスト
結合: 22年前
投稿: 34
Topic starter  

dairygoodsさん
早速の御返答有難うございます。
dairygoodsのご回答の前に前述のものを記入していたもので、
行き違いとなりましたが
//接続
db.OpenEx( _T( strCon ), CDatabase::openReadOnly | CDatabase::noOdbcDialog );
//最大2時間のクエリ待ち
db.SetQueryTimeout(60*60*2);
rs.Open( CRecordset::snapshot, _T( strSql ),CRecordset::readOnly);

で解決いたしました。
woodさん、dairygoodsさん
早速のご回答本当にありがとうございました。

また、
rs.Open( CRecordset::snapshot, _T( strSql ),CRecordset::readOnly |
CRecordset::useMultiRowFetch);
では、dbcore.cppのline2167 でerrとなりました。
のでCRecordset::useMultiRowFetchは使用いたしませんでした。
レコード数が多いと問題があるのでしょうか。
以上


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました