Comment remplir un paramètre de table évalué en utilisant un DbDataReader personnalisé?

Selon MSDN , System.Data.SqlClient prend en charge le DbDataReader parameters de table à partir des DbDataReader DataTable , DbDataReader ou IEnumerable<SqlDataRecord> .

J'ai écrit le code suivant qui remplit un paremètre de valeur table en utilisant IEnumerable<SqlDataRecord> objects:

 static void Main() { List<int> idsToSend = ... using (SqlConnection connection = new SqlConnection(connectionSsortingng)) { connection.Open(); SqlCommand command = new SqlCommand(@"SELECT ... FROM ... INNER JOIN @ids mytable ON ...", connection); command.Parameters.Add(new SqlParameter("@ids", SqlDbType.Structured) { TypeName = "int_list_type", Direction = ParameterDirection.Input, Value = GetSqlDataRecords(idsToSend) //returns IEnumerable<SqlDataRecord> }); SqlDataReader reader = command.ExecuteReader(); //consume reader... } } 

Cela fonctionne parfaitement.

La page MSDN dit:

Vous pouvez également utiliser n'importe quel object dérivé de DbDataReader pour diffuser des lignes de données dans un paramètre table.

Je voudrais utiliser un DbDataReader personnalisé à la place pour transmettre datatables de ligne. Quelque chose comme ça:

 public class CustomDataReader : DbDataReader { public CustomDataReader(IEnumerable<int> values) { } //implementation of other abstract methods and fields required by DbDataReader //... } 

J'ai changé la ligne suivante dans l'exemple de code initial:

 Value = GetSqlDataRecords(idsToSend) => Value = new CustomDataReader(idsToSend) 

Si je cours le code, il me donne l'exception suivante pendant l'exécution de command.ExecuteReader() :

Une exception non gérée de type 'System.NotSupportedException' s'est produite dans System.Data.dll Informations supplémentaires: La méthode spécifiée n'est pas prise en charge.

J'ai placé un point d'arrêt sur TOUTES les methods et propriétés de ma class CustomDbDataReader : aucune d'entre elles n'est appelée avant que l'exception ne soit DbDataReader donc il n'est probablement pas lié à l'implémentation de DbDataReader


EDIT: voici la trace de la stack, comme demandé:

  at System.Data.SqlClient.TdsParser.TdsExecuteRPC(SqlCommand cmd, _SqlRPC[] rpcArray, Int32 timeout, Boolean inSchema, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, Boolean isCommandProc, Boolean sync, TaskCompletionSource`1 completion, Int32 startRpc, Int32 startParam) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds, Boolean describeParameterEncryptionRequest) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Ssortingng method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Ssortingng method) at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, Ssortingng method) at System.Data.SqlClient.SqlCommand.ExecuteReader() at ConsoleApplication211.Program.Main() in Program.cs:line 51 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, Ssortingng[] args) at System.AppDomain.ExecuteAssembly(Ssortingng assemblyFile, Evidence assemblySecurity, Ssortingng[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() 

Vous devez implémenter GetSchemaTable , qui n'est pas marqué abstrait.

Voir aussi: Comment récupérer le schéma de colonne à l'aide de la méthode DataReader GetSchemaTable et de Visual C # .NET