Klassische ADO.NET - Wie Pass UDT Um gespeicherte Prozedur?
-
12-10-2019 - |
Frage
Ich habe diese SQL Server 2008 UDT:
CREATE TYPE [dbo].[IdentityType] AS TABLE(
[Id] [int] NOT NULL
)
Ganz einfach. Grundsätzlich ermöglicht es mir zu halten, auf eine Liste von IDs.
Ich habe diese gespeicherte Prozedur:
CREATE PROCEDURE [dbo].[Scoring_ScoreMultipleLocations]
@LocationIds [IdentityType] READONLY,
@DoRanking BIT = 0
AS
BEGIN
-- irrelevant code.
END
Entity Framework 4.0 unterstützt gespeicherte Prozeduren ausgeführt werden, die definierten Benutzer nehmen Tabellentypen als Parameter, so dass ich auf klassische ADO.NET zurückkehrt bin. Die einzige andere Möglichkeit ist eine durch Kommata getrennte String übergeben.
Wie auch immer, ich fand diesen Artikel, aber es ist ein wenig schwer zu folgen .
Ich verstehe nicht, was diese Zeile Code tut:
Table dt = preparedatatable ();
Sie bieten nicht einmal diese Methode, so dass ich keine Ahnung, was ich soll hier tun.
Das ist meine Methode Unterschrift:
internal static void ScoreLocations(List<int> locationIds, bool doRanking)
{
// how do i create DataTable??
}
Also ich habe eine Liste von int
und Notwendigkeit, dass in die UDT zu pumpen.
Kann mir jemand helfen out / zeigen Sie mir einen klaren Artikel auf, wie dies zu erreichen?
Lösung
Dieser Artikel ein bisschen mehr Hilfe sein könnte.
Im Wesentlichen werden Sie eine neue Datentabelle erstellen, die das Schema übereinstimmt, dann geben sie als Parameter.
Der Code von preparedatatable () wahrscheinlich so etwas wie aussehen:
var dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
return dt;
Nach dem, würden Sie Ihre locationIds hinzufügen:
foreach(var id in locationIds)
{
var row = dt.NewRow();
row["Id"] = id;
dt.Rows.Add(row);
}
Dann assign dt als Parameter:
var param = cmd.Parameters.AddWithValue("@LocationIDs", dt);
param.SqlDbType = SqlDbType.Structured;
param.TypeName = "dbo.IdentityType";