none
テーブル型のストアドパラメータは ODBC 経由で渡せますか? RRS feed

  • 質問

  • SQL Server 2008 から、ストアドプロシージャーのパラメータにテーブル型を
    指定できるようになりました。
    これにより、IN句 の値を パラメータで指定することが簡単になりました。

    さて、このような テーブル型をパラメータに指定するストアドプロシージャーを
    ODBC 経由で実行したいと思いますが、方法が分かりません。

    具体的には、以下のようなコードを実行するとエラーが発生します。

           DataTable dt = new DataTable();

           dt.Columns.Add("id",typeof(Int32));

            DataRow dr ;

            dr = dt.NewRow();
            dr["id"] = 1;
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr["id"] = 2;
            dt.Rows.Add(dr);

            OdbcDataAdapter odbcDA = new OdbcDataAdapter();
            m_ODBCCONN = new OdbcConnection(CONNECTIONSTRING);

            OdbcCommand odbcCmd = new OdbcCommand("TESTPROCEDURE", ODBCCONN);
            odbcCmd.CommandType = CommandType.StoredProcedure;

            //パラメータ数に基づいて、引数を定義します
            odbcCmd.Parameters.AddWithValue("@v", dt);
            ODBCCONN.Open();
           
            DataTable dtResultData = new DataTable();

            //OdbcDataAdapter形式にてデータを取得します
            odbcDA.SelectCommand = odbcCmd;
            odbcDA.Fill(dtResultData);              ← ここでエラーになります。

            ODBCCONN.Close();


    エラーメッセージは、以下です。

      オブジェクトの型 System.Data.DataTable から既知のマネージ プロバイダのネイティブ型へのマップがありません。

    ODBC 経由でテーブル型のパラメータを渡す方法の情報が見当たらず、
    できるのか、できないのかも判断ができません。

    IN句 にパラメータで、可変な複数値を渡す必要があるのですが、
    開発環境がODBC経由でしかDBにアクセスできず、
    またFunction の作成も難しい状況です。

    この テーブル型 のパラメータ だけが頼りです。
    ODBC経由で 使用する方法がありましたら、ご教授ください。

    よろしくおねがいします。

    2010年6月11日 14:19

回答

  • ODBC 接続では、うまくパラメータを渡せなかったので、
    カンマ区切りの文字列をパラメータとしてわたし
    ストアド内で スプリットし テーブル変数にインサートする方法を試したところ、
    うまく動作しそうです。

    今回はこの方法を採用したいと思いますが、
    ODBC 接続で テーブル型の パラメータを渡す方法があれば、
    引き続きコメント願います。

    • 回答としてマーク ペレイラ 2010年6月14日 3:21
    2010年6月14日 3:21

すべての返信

  • まず、.NET Framework 3.5以上の環境であることを確認してみて下さい。
    そうであれば、以下のようにするとうまくいくかもしれません。
    OdbcParameter param = command.Parameters.Add("@v", SqlDbType.Structured);
    param.Value = table;


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2010年6月13日 3:07
  • まず、.NET Framework 3.5以上の環境であることを確認してみて下さい。
    そうであれば、以下のようにするとうまくいくかもしれません。
    OdbcParameter param = command.Parameters.Add("@v", SqlDbType.Structured);
    param.Value = table;


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/


    .NET Framework 3.5 以上の環境で 試してみましたが、
    同じ エラー が発生しました。
    ODBC 経由では テーブル型の パラメータを使用できないのでしょうか。。

    2010年6月14日 0:42
  • ODBC 接続では、うまくパラメータを渡せなかったので、
    カンマ区切りの文字列をパラメータとしてわたし
    ストアド内で スプリットし テーブル変数にインサートする方法を試したところ、
    うまく動作しそうです。

    今回はこの方法を採用したいと思いますが、
    ODBC 接続で テーブル型の パラメータを渡す方法があれば、
    引き続きコメント願います。

    • 回答としてマーク ペレイラ 2010年6月14日 3:21
    2010年6月14日 3:21