0

我正在使用实体框架6调用一个存储过程,该过程使用表值参数。该存储过程无误地执行,但不返回任何行。我使用Profiler来跟踪调用,以便我可以看到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',@[email protected] 

如果我运行下面的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 

有什么不同我可以在客户端做得到th是否正确执行?

+3

'command.CommandText = “[DBO] .pList_TableProperties”; command.CommandType = CommandType.StoredProcedure'不应该真的解决你的问题,但不管做什么都很好。 –

+1

其实@JeroenMostert我认为这将解决这个问题。由于该命令未设置为StoreProcedure,并且在传递查询中没有提及该参数,因此它将被添加到该命令中,但其行为表现为完全不传递参数。 –

+0

@JeroenMostert:我认为你的解决方案是正确的。另一个选项:'command.CommandText =“EXEC [dbo] .pList_TableProperties @IDS”;'而不是'command.CommandText =“EXEC [dbo] .pList_TableProperties”;' – TriV

回答

0

此代码执行在运行时,下面的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] 

这个代码不返回任何记录,因为它没有任何参数传递到存储过程。 这不会导致错误,但不会输出任何内容。 代码应该是这样的(I证明缺少与参数*****) :

exec sp_executesql N'EXEC [dbo].pList_TableProperties *****@IDS*****',N'@IDS [dbo].[IntegerTableParameter] 
相关问题