3

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() 
+0

Pouvez-vous modifier la question de montrer la trace de la pile de l'exception – stuartd

+0

@stuartd: fait – tigrou

+1

http://stackoverflow.com/a/42099675/2996339 – meziantou

Répondre