Classic Ado.net-ストアドプロシージャにUDTを渡す方法は?
-
12-10-2019 - |
質問
私はこのSQL Server 2008 UDTを持っています:
CREATE TYPE [dbo].[IdentityType] AS TABLE(
[Id] [int] NOT NULL
)
ものすごく単純。基本的に、IDのリストを保持することができます。
私はこのストアドプロシージャを持っています:
CREATE PROCEDURE [dbo].[Scoring_ScoreMultipleLocations]
@LocationIds [IdentityType] READONLY,
@DoRanking BIT = 0
AS
BEGIN
-- irrelevant code.
END
エンティティフレームワーク4.0は、ユーザー定義のテーブルタイプをパラメーターとして取得するストアドプロシージャの実行をサポートしていないため、クラシックADO.NETに戻ります。他の唯一のオプションは、コンマセーパーの文字列を渡すことです。
とにかく、私は見つけました これ 記事ですが、従うのは少し難しいです。
このコードの行が何をしているのかわかりません:
datatable dt = predatatable();
彼らはその方法さえ提供していないので、私がここで何をすべきか分かりません。
これが私の方法の署名です:
internal static void ScoreLocations(List<int> locationIds, bool doRanking)
{
// how do i create DataTable??
}
だから私はのリストを持っています int
そして、それをUDTに送り込む必要があります。
誰かが私を助けてくれる/これを達成する方法に関する明確な記事を教えてもらえますか?
解決
この記事 もう少し助けになるかもしれません。
基本的に、スキーマに一致する新しいデータテーブルを作成し、パラメーターとして渡すことになります。
predataTable()のコードは、おそらく次のようになります。
var dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
return dt;
その後、LocationIdsを追加する必要があります。
foreach(var id in locationIds)
{
var row = dt.NewRow();
row["Id"] = id;
dt.Rows.Add(row);
}
次に、dtをパラメーターとして割り当てます。
var param = cmd.Parameters.AddWithValue("@LocationIDs", dt);
param.SqlDbType = SqlDbType.Structured;
param.TypeName = "dbo.IdentityType";
所属していません StackOverflow