CRecordset時における時間切れについて

[戻る]
おっか 2003/02/23(日) 23:38:13
はじめまして
最近、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 2003/02/24(月) 06:09:04
>CommandTimeout
はADOには有効のようですね
ご質問なさっているODBCには定義できないのでは?

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

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

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

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

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

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

おっか 2003/02/24(月) 12:19:07
woodさん、早速のご回答有難うございます。

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

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

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

おっか 2003/02/24(月) 12:39:26
[[解決]]
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は使用いたしませんでした。
レコード数が多いと問題があるのでしょうか。
以上

古いスレッドには追加発言できません。