初日 最新 目次 MAIL HOME


*-- To Tell The Truth --*
Cruz
MAIL
HOME

My追加

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]; にしました。

検証したストアドプロシージャーについては、明日の日記で報告します。

明日はたいした日記ネタもないだろうから・・・