Selon MSDN, System.Data.SqlClient
prend en charge le remplissage des paramètres de table de DataTable
, DbDataReader
ou IEnumerable<SqlDataRecord>
objets.Comment remplir un paramètre de table évalué en utilisant un DbDataReader personnalisé?
j'ai écrit le code suivant qui peuplent une table à l'aide d'une valeur paremeter IEnumerable<SqlDataRecord>
objets:
static void Main()
{
List<int> idsToSend = ...
using (SqlConnection connection = new SqlConnection(connectionString))
{
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...
}
}
Il fonctionne parfaitement.
La page MSDN dit:
Vous pouvez également utiliser un objet dérivé de
DbDataReader
aux lignes flux de données à un paramètre de table d'une valeur.
Je souhaite utiliser un DbDataReader
personnalisé pour transmettre les données de ligne. Quelque chose comme ceci:
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 lance le code, il me donne l'exception suivante lors de 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 sup porté.
Je mets un point d'arrêt sur toutes les méthodes et propriétés de ma CustomDbDataReader
classe: aucun d'entre eux sont appelés avant que je sois l'exception pour son probablement pas liée à la mise en œuvre du DbDataReader
EDIT : voici la trace de la pile, comme l'a 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, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader()
at ConsoleApplication211.Program.Main() in Program.cs:line 51
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] 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()
Pouvez-vous modifier la question de montrer la trace de la pile de l'exception – stuartd
@stuartd: fait – tigrou
http://stackoverflow.com/a/42099675/2996339 – meziantou