*-- To Tell The Truth --*
Cruz
MAIL
HOME
|
|
2002年01月11日(金) ■ |
|
スケジュール通り |
|
昨日、大騒ぎした『SQL文が長すぎて桁落ち』現象は解決しました。
昨日の日記では、オオイシさまから、アドバイスメールを頂き、恐悦至極、感謝感激・・・同業の知り合いが少ないもので、ホントに嬉しかったです。
そして恥ずかしながらも
■解決編■
○Viewの使用
Viewというものを正しく理解していませんでした。 SELECTする直前に作成するものじゃなくていいものだったんです。 DB2だと『視点』と言う表現で説明されていました。
一度作ってずっーーと置いておいて、クライアントからは 置きっぱなしのViewに対してSELECTかければいいんですね。
ですから、SQL文の簡潔性を考えても、これは買いでした。
○SQL格納文字列の大きさ
何気なくCHAR_MAXを使用していましたが、これはたったの127しかなかったんですね。 いくらなんでも、小さすぎました。
・・ということで、恥ずかしながらソース公開。
+++++++++
try{ // ADOオブジェクトの生成 m_pConnect.CreateInstance(__uuidof(Connection)); m_pCommand.CreateInstance(__uuidof(Command)); m_pRecordset.CreateInstance(__uuidof(Recordset));
// データベースへの接続 hr = m_pConnect->Open( _bstr_t(DB2_NAME), _bstr_t(DB2_USERID), _bstr_t(DB2_PASSWD), adConnectUnspecified);
if(SUCCEEDED(hr)){ // SQLの設定 m_pCommand->ActiveConnection = m_pConnect; SetSelect(); // 検索条件格納処理 m_pCommand->CommandText =_bstr_t(cpSQLStr); m_pRecordset->PutRefSource(m_pCommand);
// レコードセットの取得 _variant_t vNull; // VARIANT型のNULLとして使う vNull.vt = VT_ERROR; vNull.scode = DISP_E_PARAMNOTFOUND; m_pRecordset->Open(vNull, vNull, adOpenStatic, adLockReadOnly, adCmdText);
// レコードのバインドを行うインターフェイスポインタ取得 if(FAILED(m_pRecordset->QueryInterface(__uuidof(IADORecordBinding), (LPVOID*)&picRs))){ _com_issue_error(E_NOINTERFACE); } picRs->BindToRecordset(&m_rsRecSet);
// 検索結果件数 if(m_pRecordset->GetRecordCount() <= 0){ return FALSE; }
// 先頭レコードへ移動し、フィールドの値を取得 m_pRecordset->MoveFirst();
// リストビューデータ表示 DisplayList(hList);
}else{ return FALSE; } } catch (_com_error &e) { dump_com_error(e, hWnd); }
+++++++++ try〜catch 入れました。 char cpSQLStr[CHAR_MAX * 3]; にしました。
検証したストアドプロシージャーについては、明日の日記で報告します。
明日はたいした日記ネタもないだろうから・・・
|
|