我正在使用实体框架6,调用一个带有表值参数的存储过程。存储过程执行时没有错误但不返回任何行。我使用分析器跟踪调用,以便我可以看到EF如何执行它。如果我以不同的方式手动调用存储过程,它将按预期返回行。
这是我的应用程序代码:
<uses-permission android:name="android.permission.INTERNET" />
此代码在运行时执行以下sql语句,该语句不返回任何记录:
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
我可以在客户端做些不同的事情来让它正确执行吗?
答案 0 :(得分: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]
此代码不返回任何记录,因为它不会将任何参数传递给存储过程。 这不会导致错误,但不会输出任何内容。 代码看起来应该是这样的(我用*****证明缺少参数) :
exec sp_executesql N'EXEC [dbo].pList_TableProperties *****@IDS*****',N'@IDS [dbo].[IntegerTableParameter]