Cómo pasar un parámetro de valor de tabla

Estoy tratando de pasar un parámetro de valor de tabla a un procedimiento almacenado, pero sigo obteniendo una excepción (ver a continuación).

SqlCommand c = new SqlCommand("getPermittedUsers", myConn) { CommandType = CommandType.StoredProcedure }; c.Parameters.AddWithValue("@intNotifyingUserId", notifyingUserId); c.Parameters.AddWithValue("@tSelectedPdfIds", sharedPdfs).SqlDbType = SqlDbType.Structured; SqlDataReader dr = c.ExecuteReader(); 

El tipo se define en el servidor de esta manera:

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

He intentado pasar sharedPdfs como List e IQueryable , pero sigo recibiendo la siguiente excepción:

Object must implement IConvertible.

¿Alguien sabe lo que estoy haciendo mal? La documentación implica que debería poder pasar una lista como TVP pero no dar ningún ejemplo.

Gracias.

Puede pasar el parámetro como DataTable , IEnumerable o DbDataReader .

El siguiente ejemplo ilustra el uso de DataTable o IEnumerable :

Código SQL

 CREATE TABLE dbo.PageView ( PageViewID BIGINT NOT NULL CONSTRAINT pkPageView PRIMARY KEY CLUSTERED, PageViewCount BIGINT NOT NULL ); CREATE TYPE dbo.PageViewTableType AS TABLE ( PageViewID BIGINT NOT NULL ); CREATE PROCEDURE dbo.procMergePageView @Display dbo.PageViewTableType READONLY AS BEGIN MERGE INTO dbo.PageView AS T USING @Display AS S ON T.PageViewID = S.PageViewID WHEN MATCHED THEN UPDATE SET T.PageViewCount = T.PageViewCount + 1 WHEN NOT MATCHED THEN INSERT VALUES(S.PageViewID, 1); END 

C # Code

 private static void ExecuteProcedure(bool useDataTable, string connectionString, IEnumerable ids) { using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); using (SqlCommand command = connection.CreateCommand()) { command.CommandText = "dbo.procMergePageView"; command.CommandType = CommandType.StoredProcedure; SqlParameter parameter; if (useDataTable) { parameter = command.Parameters.AddWithValue("@Display", CreateDataTable(ids)); } else { parameter = command.Parameters.AddWithValue("@Display", CreateSqlDataRecords(ids)); } parameter.SqlDbType = SqlDbType.Structured; parameter.TypeName = "dbo.PageViewTableType"; command.ExecuteNonQuery(); } } } private static DataTable CreateDataTable(IEnumerable ids) { DataTable table = new DataTable(); table.Columns.Add("ID", typeof(long)); foreach (long id in ids) { table.Rows.Add(id); } return table; } private static IEnumerable CreateSqlDataRecords(IEnumerable ids) { SqlMetaData[] metaData = new SqlMetaData[1]; metaData[0] = new SqlMetaData("ID", SqlDbType.BigInt); SqlDataRecord record = new SqlDataRecord(metaData); foreach (long id in ids) { record.SetInt64(0, id); yield return record; } }