8

PetaPoco を使用して SQL Server 2008 R2 ストアド プロシージャを呼び出そうとしています。

ストアド プロシージャは、テーブル値パラメーターを受け入れます。

テーブル値パラメーターを使用して、petapoco でストアド プロシージャを呼び出すにはどうすればよいですか?

ここで私がやろうとしていること:

var db = new PetaPoco.Database("repikaciskaBaza");

DataTable table = new DataTable();
DataColumn id = table.Columns.Add("id", type: typeof(Int32));

for (int i = 0; i < 10;i++ )
{
    DataRow row = table.NewRow();
    row["id"] = i;
    table.Rows.Add(row);
}

var param = new SqlParameter();
param.DbType = DbType.Object;
param.ParameterName = "@art_id";

param.SqlValue = table;

var lista = db.Query<pocoArts>(";exec dbo.test_sporc_param @0", param);

このコードは私に例外を与えます:

着信表形式データ ストリーム (TDS) リモート プロシージャ コール (RPC) プロトコル ストリームが正しくありません。
パラメーター 3 ("@0"): データ型 0x62 (sql_variant) には、型固有のメタデータに対して無効な型があります。

パラメータ値を設定すると

param.SqlDbType = SqlDbType.Structured;

次に、次のような例外が発生します

The table type parameter '@0' must have a valid type name.

私のパラメータを次のように定義すると

            param.SqlDbType = SqlDbType.Structured;
            param.SqlValue = table;
            param.ParameterName = "@art_id";
            param.TypeName = SqlDbType.Structured.ToString();

その後、例外が発生します

列、パラメーター、または変数 @0。: 構造化データ型が見つかりません。

SqlParamSQL Server にデータを送信できるように、テーブル値のパラメーターを使用して定義するにはどうすればよいですか?

解決策:

var param = new SqlParameter();
param.SqlDbType = SqlDbType.Structured; // According to marc_s
param.SqlValue = table; 
param.ParameterName = "@art_id";
param.TypeName = "dbo.typ_art_id"; // this is TYP from SQL Server database it needs to be equal to type defined in SQL Server not type of param
4

1 に答える 1

5

テーブル値パラメーター に関する関連する MSDN ドキュメントによると、次を使用する必要があります。

var param = new SqlParameter();
param.SqlDbType = SqlDbType.Structured;

これSqlDbType.Structuredが鍵です。使用しないでくださいDbType.Object

于 2013-06-10T08:14:36.693 に答える