4

整数配列を .NET からストアド プロシージャに渡す必要があったため、トピックをグーグル検索し、最終的にArrays and Lists in SQL Server 2008に出くわしました。これは、Erland Sommarskog によって書かれ、これについての標準的な方法と思われます。処理する。

ユーザー定義のテーブル型をストアド プロシージャに渡すために 2 つの異なる方法を試しましたが、それぞれで例外が発生します。これらのマナーはどちらも、上記のリンクで Erland Sommarskog が使用しているものと似ています。

方法 #1 - DataTable を SqlParameter として使用する

DataTable dt = new DataTable();
dt.Columns.Add("n", typeof(int));

// Just adding 3 test rows to the DataTable
DataRow dr = dt.NewRow();
dr["n"] = 1;
dt.Rows.Add(dr);

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

dr = dt.NewRow();
dr["n"] = 3;
dt.Rows.Add(dr);

// Creation of the SqlParameter
SqlParameter p = new SqlParameter();
p.ParameterName = "@ids";
p.Direction = ParameterDirection.Input;
p.SqlDbType = SqlDbType.Structured;
p.TypeName = "lstInt_TblType";
p.Value = dt;

// Blows up here
DataSet ds = DAWrapper.GetDataSet(
    Common.GetDB(),
    "usp_Test",
    new SqlParameter[] { p });

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

方法 2 - リストを SqlParameter として使用する

List<SqlDataRecord> lstSDR = new List<SqlDataRecord>();
SqlMetaData[] tvp_definition = { new SqlMetaData("n", SqlDbType.Int) };

// Just adding 3 test rows
SqlDataRecord rec = new SqlDataRecord(tvp_definition);
rec.SetInt32(0, 50);
lstSDR.Add(rec);

rec = new SqlDataRecord(tvp_definition);
rec.SetInt32(0, 51);
lstSDR.Add(rec);

rec = new SqlDataRecord(tvp_definition);
rec.SetInt32(0, 52);
lstSDR.Add(rec);

// Creation of the SqlParameter
SqlParameter p = new SqlParameter();
p.ParameterName = "@ids";
p.Direction = ParameterDirection.Input;
p.SqlDbType = SqlDbType.Structured;
p.TypeName = "lstInt_TblType";
p.Value = lstSDR;

// Blows up here
DataSet ds = DAWrapper.GetDataSet(
    Common.GetDB(),
    "usp_Test",
    new SqlParameter[] { p });

そして、私がこれのために得る例外は次のように述べています: オブジェクト型 System.Collections.Generic.List`1[[Microsoft.SqlServer.Server.SqlDataRecord, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] を既知のマネージド プロバイダーのネイティブ タイプに変換します。

その他の情報 lstInt_TblType は、SQL Server 2008 のユーザー定義テーブル タイプです。存在します (これを 3 回確認しました!)。「n」と呼ばれるint型の主キーの列が1つあり、nullは許可されません。Erland がセットアップした方法を正確にコピーしました。

また、ストアド プロシージャ usp_Test が SQL Server Manager Studio から機能することも確認したので、その方向から例外が発生していないことはほぼ確実です。これは、ストアド プロシージャが機能することを確認するために使用した t-sql です。

DECLARE @ids lstInt_TblType
INSERT @ids(n) VALUES(1),(2),(3)
EXEC usp_Test ids

これでどこに行くべきかについての提案は大歓迎です。ありがとう!

*編集: * ストアド プロシージャ usp_Test:

ALTER PROCEDURE [dbo].[usp_Test]
(
    @ids lstInt_TblType READONLY
)
AS
BEGIN

    SET NOCOUNT ON;

        select *
    from dbo.dat_MetaData
    where MetaDataTypeID in (select n from @ids)
END
GO
4

2 に答える 2

2

それを行う別の方法を見つけました。この方法では、System.Data.SqlClient ライブラリを使用してデータベースへの接続を作成し、ストアド プロシージャ名を指定してから、SQL Server ユーザー定義テーブル型として機能する DataTable としてパラメーターを渡します。

using (SqlConnection conn = new SqlConnection(connStr)) {
    SqlCommand cmd = conn.CreateCommand();
    cmd.CommandType = System.Data.CommandType.StoredProcedure;
    cmd.CommandText = "dbo.usp_Test";
    cmd.Parameters.AddWithValue("@ids", dt);
    conn.Open();

    using (SqlDataReader sqlReader = cmd.ExecuteReader()) {
        DataTable retTbl = new DataTable();
        retTbl.Load(sqlReader);
    }
}
于 2012-05-16T21:37:43.303 に答える
0

テーブル値パラメーター データをストアド プロシージャに渡す方法の良い例は、Microsoft 独自のテーブル値パラメーターリファレンスにも記載されています。

于 2014-02-06T22:37:52.890 に答える