6

que tienen este SQL Server 2008 UDT:Classic ADO.NET - ¿Cómo pasar UDT al procedimiento almacenado?

CREATE TYPE [dbo].[IdentityType] AS TABLE(
    [Id] [int] NOT NULL 
) 

bastante simple. Básicamente, me permite mantener una lista de id.

tengo este procedimiento almacenado:

CREATE PROCEDURE [dbo].[Scoring_ScoreMultipleLocations] 
    @LocationIds [IdentityType] READONLY, 
    @DoRanking BIT = 0 
AS 
BEGIN 
    -- irrelevant code. 
END 

Entity Framework 4.0 no admite la ejecución de los procedimientos almacenados que tienen definidos por el usuario tipos de tabla como parámetro, así que estoy volviendo a ADO.NET clásico. La única otra opción es pasar una secuencia separada por comas.

De todos modos, encontré this artículo, pero es un poco difícil de seguir.

No entiendo lo que esta línea de código está haciendo:

DataTable dt = preparedatatable();

Ni siquiera proporcionan ese método, así que no tengo idea de lo que se supone que debo hacer aquí.

Este es mi método de firma:

internal static void ScoreLocations(List<int> locationIds, bool doRanking) 
{ 
    // how do i create DataTable?? 
} 

así que tengo una lista de int y la necesidad de bombear que en la UDT.

¿Puede alguien ayudarme me/punto con un artículo de clara de cómo lograr esto?

Respuesta

8

This article puede ser un poco más ayuda.

En esencia, vamos a crear una nueva DataTable que coincide con el esquema, a continuación, pasarlo como un parámetro.

El código de preparedatatable() probablemente sería algo como:

var dt = new DataTable(); 
dt.Columns.Add("Id", typeof(int)); 
return dt; 

Después de lo cual, habría que añadir sus locationIds:

foreach(var id in locationIds) 
{ 
    var row = dt.NewRow(); 
    row["Id"] = id; 
    dt.Rows.Add(row); 
} 

A continuación, asigne dt como parámetro:

var param = cmd.Parameters.AddWithValue("@LocationIDs", dt); 
param.SqlDbType = SqlDbType.Structured; 
param.TypeName = "dbo.IdentityType"; 
+0

Ahh k, eso tiene sentido. Probando ahora, estad atentos ... (+1 por ahora). – RPM1984

+0

funciona, * pero * - por alguna razón tarda más de 10 segundos, y finalmente el analizador de sql muestra "Error - 2 - Cancelado". El sql producido se ve bien, cuando lo ejecuto en sms tarda RPM1984

+0

Tengo Usé esto sin tomar 10 segundos; No estoy seguro de qué podría causar eso. De todos modos, si el parámetro solo necesita ser una lista de números enteros, probablemente sea mejor con una lista CSV y una función dividida de todos modos. Los TVP realmente ayudan cuando intentas enviar múltiples valores asociados para cada fila (por ejemplo, múltiples columnas en tu tipo) donde con una lista CSV esto requeriría un delimitador secundario (por ejemplo, una lista CSV de datos delimitados por tuberías). –

Cuestiones relacionadas