整数配列を .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