2016-10-24 29 views
2

我使用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)

+0

也许你需要'_context.Database。SqlQuery (“SP_TEST_TLP @List”,参数)'代替 – haim770

+2

ExecuteSqlCommand返回一个int值,它是过程调用的返回值。这不是行集,它是不同的传输方式(例如'SqlDataAdapter','SqlDataReader',或者在你的情况下可能''DataTable''通过'ExecuteDataTable'来运行 – dlatikay

+0

另外,你的'WHERE Clients.Id IN('@List') '应该是'WHERE Clients.Id IN(从@list中选择id)' –

回答

4

ExecuteSqlCommand返回一个int值,用于操作查询(插入,更新)并返回受单个非查询影响的行数。 尝试ExecuteDataTable或类似的结果。

这里有一个很好的例子: Retrieve a DataTable using a SQL Statement

2

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery(v=vs.110).aspx

是的,这是ADO.Net但这是底层代码。

对于UPDATE,INSERT和DELETE语句,返回值是 数目该命令影响的行。当插入或更新的 表中存在触发器时,返回值包括受插入或更新操作影响的行的编号 以及受触发器或触发器影响的行的编号 。对于所有其他类型的 语句,返回值为-1。如果发生回滚,则返回值 的值也是-1。

顺便说一句...你有一个存储过程中的错误。

CREATE PROCEDURE [dbo].[USP_TEST_TLP] -- don't use SP_ 
    @List dbo.IdArray READONLY 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT * 
    FROM Clients 
    WHERE Clients.Id IN (SELECT Id FROM @list) -- use subquery 

    /* or a join 
    SELECT * 
    FROM Clients 
    INNER JOIN @list I ON Clients.Id = I.Id 
    */ 
END 
相关问题