はじめまして
最近、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 ) );
>CommandTimeout
はADOには有効のようですね
ご質問なさっているODBCには定義できないのでは?
今のコードに追記して有効かなと思えるのは
CRecordset::useMultiRowFetch
と思えます
RFXの扱いが変わるようですけど
また、データ条件は絞れないのですかね?
このコード記述だと
VC(アプリ)→ODBC→SQL7→コンパイル(文法解析)→実行→結果
→SQL7→ODBC→VC(アプリ)のステップ(一部割愛)
で実行されると思いますが
ストアドプロシージャ使うことを考えてみてはどうでしょうか
もう少し選択肢広がるのではないですか
私も大量データこそ扱っていませんがWin XPで
同じような環境で開発を行っています
CDatabase::SetLoginTimeout()とか、
CDatabase::SetQueryTimeout()という関数がありますけど、
これでタイムアウトを長くしてみてはどうでしょう。
woodさん、早速のご回答有難うございます。
早速、試させて頂きました
下記のようにソースを変更しましたが
やはり、時間
rs.Open( CRecordset::snapshot, _T( strSql ),CRecordset::readOnly |
CRecordset::useMultiRowFetch);
として行いなましたが、まだ”時間切れなりました”となってしまいました。
時間切れになる時間を長くする方法はなにか無いものでしょうか。
お忙しいなか、ご回答いただきまして申し訳ございませんが、
その他、事項、C++での解決方法がございましたらご回答頂ければ
幸いです。
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は使用いたしませんでした。
レコード数が多いと問題があるのでしょうか。
以上