Я использую Entity Framework 6, вызывая хранимую процедуру, которая принимает параметр табличного значения. Хранимая процедура выполняется без ошибок, но не возвращает строк. Я использую профилировщик для отслеживания вызова, чтобы увидеть, как его выполняет EF. Если я вручную вызову хранимую процедуру другим способом, она вернет строки, как и ожидалось.
Вот мой код приложения:
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();
}
}
}
Этот код выполняет следующие операторы SQL во время выполнения, которые не возвращают никаких записей:
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',@IDS=@p3
Если я запущу следующий sql, он вернет записи:
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
Есть ли что-то другое, что я могу сделать на стороне клиента, чтобы это выполнялось правильно?
command.CommandText = "[dbo].pList_TableProperties"; command.CommandType = CommandType.StoredProcedure
на самом деле не должно решить вашу проблему, но в любом случае это хорошо. - person Jeroen Mostert   schedule 01.08.2017command.CommandText = "EXEC [dbo].pList_TableProperties @IDS";
вместоcommand.CommandText = "EXEC [dbo].pList_TableProperties";
- person TriV   schedule 01.08.2017sp_executesql
будет жаловаться на параметры привязки, отсутствующие в операторе. В любом случае, именно поэтому рекомендуется указыватьCommandType
при вызове хранимой процедуры, потому что тогда вы обязательно получите ошибки об отсутствующих и лишних параметрах. - person Jeroen Mostert   schedule 01.08.2017