我使用SQL Server 2012和Entity Framework6。为什么我从存储过程中获得-1?
我创建的表值参数:
CREATE TYPE IdArray AS TABLE
(
Id int
);
在这里,我的存储过程:
ALTER PROCEDURE [dbo].[SP_TEST_TLP]
@List dbo.IdArray READONLY
AS
BEGIN
SET NOCOUNT ON;
SELECT *
FROM Clients
WHERE Clients.Id IN (select Id from @List)
END
在Visual Studio我调用存储过程,并通过PARAMATERS存储过程。
我做这种方式:
创建数据表:
var myDataTable = new DataTable();
myDataTable.Columns.Add("Id", typeof(int));
myDataTable.Rows.Add(1);
myDataTable.Rows.Add(3);
myDataTable.Rows.Add(6);
从数据表创建SqlParameter
:
SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@List";
parameter.SqlDbType = System.Data.SqlDbType.Structured;
parameter.TypeName = "dbo.IdArray";
parameter.Value = myDataTable;
消防存储过程并传递参数:
var data = _context.Database.ExecuteSqlCommand("SP_TEST_TLP @List", parameter);
问题是ExecuteSqlCommand
返回-1
。
为什么ExecuteSqlCommand
返回-1
而我期望数据库中的行?
更新:
更改该行:WHERE Clients.Id IN( '@list')
要这样:WHERE Clients.Id IN(从@list选择ID)
也许你需要'_context.Database。SqlQuery(“SP_TEST_TLP @List”,参数)'代替 –
haim770
ExecuteSqlCommand返回一个int值,它是过程调用的返回值。这不是行集,它是不同的传输方式(例如'SqlDataAdapter','SqlDataReader',或者在你的情况下可能''DataTable''通过'ExecuteDataTable'来运行 – dlatikay
另外,你的'WHERE Clients.Id IN('@List') '应该是'WHERE Clients.Id IN(从@list中选择id)' –