none
ADOでSQL文のエラー RRS feed

  • 質問

  •  // ADO関連の変数
     _ConnectionPtr m_pConnect;        // Connectionオブジェクト
     _CommandPtr  m_pCommand;        // Commandオブジェクト
     _RecordsetPtr m_pRecordset;       // Recordsetオブジェクト

    と変数を宣言して、

     try
     {
      ::CoInitialize(NULL);        // COMの初期化処理

      // ADOオブジェクトの生成
      m_pConnect.CreateInstance(__uuidof(Connection));
      m_pCommand.CreateInstance(__uuidof(Command));
      m_pRecordset.CreateInstance(__uuidof(Recordset));

      // データベースへの接続
      m_pConnect->Open(
       _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\福山\\業務報告\\在庫管理\\HinmeiCode.mdb"),
       _T(""), _T(""), adOpenUnspecified);
     }
     catch (_com_error &ex)
     {
      AfxMessageBox(ex.Description(), MB_OK | MB_ICONHAND);
      return TRUE;
     }

    でデータベースに接続しています。

     try
     {
      // SQLの設定
      m_pCommand->ActiveConnection = m_pConnect;
      m_pCommand->CommandText      = _bstr_t(sSql);
      m_pRecordset->PutRefSource(m_pCommand);

      // レコードセットの取得
      _variant_t vNull;         // VARIANT型のNULLとして使う
      vNull.vt    = VT_ERROR;
      vNull.scode = DISP_E_PARAMNOTFOUND;
      m_pRecordset->Open(vNull, vNull, adOpenDynamic, adLockOptimistic, adCmdUnknown);
     }
     catch (_com_error &ex)
     {
      AfxMessageBox(ex.Description(), MB_OK | MB_ICONHAND);
      return;
     }

    で、レコードを読み込もうとすると、「1つ以上のパラメータの値が設定されていません。」というエラーメッセージが表示されます。

    SQL文で足りないもがわかりません。

    どこを修正すれば読み出せるでしょうか。

    C#でDAOを使った場合は上記SQL文で読み込めました。

    2012年11月26日 10:08

回答

  • 自己レスです。

    sCodeは文字列なので、SQL文の

     CString  sSql = _T("SELECT * FROM CodeTable WHERE sCode = ");

     sCode = m_xveditCode[nIndex];
     sSql += sCode + _T(" ORDER BY ID DESC");

    CString  sSql = _T("SELECT * FROM CodeTable WHERE sCode = '");

    sCode = m_xveditCode[nIndex];
    sSql += sCode + _T("' ORDER BY ID DESC");

    sCodeの前後に文字列を表すシングルクオーテションで囲むことでエラーがでなくなりました。

    • 回答としてマーク 佐伯玲 2012年11月29日 6:17
    2012年11月26日 10:42

すべての返信

  • 自己レスです。

    sCodeは文字列なので、SQL文の

     CString  sSql = _T("SELECT * FROM CodeTable WHERE sCode = ");

     sCode = m_xveditCode[nIndex];
     sSql += sCode + _T(" ORDER BY ID DESC");

    CString  sSql = _T("SELECT * FROM CodeTable WHERE sCode = '");

    sCode = m_xveditCode[nIndex];
    sSql += sCode + _T("' ORDER BY ID DESC");

    sCodeの前後に文字列を表すシングルクオーテションで囲むことでエラーがでなくなりました。

    • 回答としてマーク 佐伯玲 2012年11月29日 6:17
    2012年11月26日 10:42
  • 文字列にシングルクォテーション(')で囲まれていないため、パラメータとして扱われたのが原因みたいですね。

    補足ですが、SQLクエリーに画面から入力した内容を条件に含めると、SQLインジェクションの脆弱性を抱えてしまうため、本来であればパラメータークエリーにした方が望ましいと思われまし、SQL Serverのパフォーマンスも、こちらの方が上がります。

    2012年11月27日 0:50
  • こんにちは、B_Wolf さん
    フォーラムオペレータの佐伯 玲 です。

    自己解決されたようなので後からこのスレッドを見られる方のためにも「回答としてマーク」をさせていただきました。
    また、CatTail さんからも情報が寄せられておりますこちらも参考になりそうな情報だったので同様にマークさせていただきました。

    今後ともMSDN フォーラムを宜しくお願いいたします。
    __________________________
    日本マイクロソフト株式会社 フォーラム オペレータ 佐伯 玲

    2012年11月29日 6:17