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?
'Command.CommandText = "[dbo] .pList_TableProperties"; command.CommandType = CommandType.StoredProcedure' ne devrait pas vraiment résoudre votre problème mais est bon à faire malgré tout. –
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. –
@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