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