0

J'utilise entity Framework 6, appelant une procédure stockée qui prend un paramètre de valeur de table. La procédure stockée s'exécute sans erreur mais ne retourne aucune ligne. J'utilise profiler pour suivre l'appel afin que je puisse voir comment EF l'exécute. Si j'appelle manuellement la procédure stockée d'une manière différente, les lignes seront renvoyées comme prévu.L'appel de la procédure stockée avec les paramètres de valeur de table ne renvoie aucune ligne

Voici mon code d'application:

public IEnumerable<Table1> ListTableValueParameter(IEnumerable<int> lstIDs) 
{ 
    //Convert enumerable int to DataTable 
    System.Data.DataTable dtIDs = new System.Data.DataTable(); 
    dtIDs.Columns.Add("ID", typeof(int)); 

    foreach(int i in lstIDs) 
    { 
     dtIDs.Rows.Add(i); 
    } 

    var db = new POCDBContext(); 

    //Create parameter for table 
    System.Data.SqlClient.SqlParameter p = new System.Data.SqlClient.SqlParameter(); 
    p.SqlDbType = System.Data.SqlDbType.Structured; 
    p.ParameterName = "@IDS"; 
    p.Value = dtIDs; 
    p.TypeName = "dbo.IntegerTableParameter"; 

    using (var connection = db.Database.Connection) 
    { 
     connection.Open(); 
     var command = connection.CreateCommand(); 
     command.CommandText = "EXEC [dbo].pList_TableProperties"; 

     command.Parameters.Add(p); 

     //Execute stored procedure 
     using (var reader = command.ExecuteReader()) 
     { 
      return 
       ((IObjectContextAdapter)db) 
        .ObjectContext 
        .Translate<Table1>(reader).ToList(); 

     } 
    } 
} 

Ce code exécute les instructions SQL suivantes lors de l'exécution, qui ne renvoie aucun enregistrement:

declare @p3 dbo.IntegerTableParameter 
insert into @p3 values(1) 
insert into @p3 values(2) 
insert into @p3 values(3) 
insert into @p3 values(4) 
insert into @p3 values(5) 

exec sp_executesql N'EXEC [dbo].pList_TableProperties',N'@IDS [dbo].[IntegerTableParameter] READONLY',@[email protected] 

Si je lance la requête SQL suivante, il renvoie des enregistrements:

declare @p3 dbo.IntegerTableParameter 
insert into @p3 values(1) 
insert into @p3 values(2) 
insert into @p3 values(3) 
insert into @p3 values(4) 
insert into @p3 values(5) 

EXEC [dbo].pList_TableProperties @p3 

Y a-t-il quelque chose de différent que je peux faire du côté client pour obtenir est d'exécuter correctement?

+3

'Command.CommandText = "[dbo] .pList_TableProperties"; command.CommandType = CommandType.StoredProcedure' ne devrait pas vraiment résoudre votre problème mais est bon à faire malgré tout. –

+1

En fait @JeroenMostert je pense que cela va résoudre le problème. Comme la commande n'est pas définie sur StoreProcedure et qu'il n'y a aucune mention du paramètre dans la requête de passage, elle sera ajoutée à la commande mais se comportera comme si elle ne passait pas du tout de paramètre. –

+0

@JeroenMostert: Je pense que votre solution est correcte. Une autre option: 'command.CommandText =" EXEC [dbo] .pList_TableProperties @IDS ";' au lieu de 'command.CommandText =" EXEC [dbo] .pList_TableProperties ";' – TriV

Répondre

0

Ce code exécute les instructions SQL suivantes lors de l'exécution, qui renvoie aucun enregistrement:

declare @p3 dbo.IntegerTableParameter 
insert into @p3 values(1) 
insert into @p3 values(2) 
insert into @p3 values(3) 
insert into @p3 values(4) 
insert into @p3 values(5) 

exec sp_executesql N'EXEC [dbo].pList_TableProperties',N'@IDS [dbo].[IntegerTableParameter] 

Ce code renvoie pas d'enregistrement car il ne passe aucun paramètre à la procédure stockée. Cela ne provoque pas d'erreur mais ne génère rien. Le code devrait ressembler à ceci (je manque en évidence avec paramètre *****) :

exec sp_executesql N'EXEC [dbo].pList_TableProperties *****@IDS*****',N'@IDS [dbo].[IntegerTableParameter]