【问题标题】:What is the best way to pass the table in Stored Procedure在存储过程中传递表的最佳方法是什么
【发布时间】:2017-01-03 07:00:19
【问题描述】:

我正在尝试将表传递给存储过程以进行批量插入更新。我在数据库中为表创建了一个自定义类型,还使用表参数(自定义类型)创建了一个过程。

但是,当我在 Entity Framework 中更新模型时,它不会生成用于传递表参数的正确代码。

以下是我的存储过程的声明:

CREATE PROCEDURE [dbo].[TimeClock_UpdateTimeClockData]
    @dateTimeFrom date,
    @dateTimeTo date,
    @employeeEarnings EmployeeEarningsTable readonly
AS
BEGIN
   --- insert/update operations
END

这是实体框架生成的代码:

public virtual int TimeClock_UpdateTimeClockData(Nullable<System.DateTime> dateTimeFrom, Nullable<System.DateTime> dateTimeTo)
{
    var dateTimeFromParameter = dateTimeFrom.HasValue ?
        new SqlParameter("dateTimeFrom", dateTimeFrom) :
        new SqlParameter("dateTimeFrom", typeof(System.DateTime));

    var dateTimeToParameter = dateTimeTo.HasValue ?
        new SqlParameter("dateTimeTo", dateTimeTo) :
        new SqlParameter("dateTimeTo", typeof(System.DateTime));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreQuery("TimeClock_UpdateTimeClockData @dateTimeFrom,@dateTimeTo", dateTimeFromParameter, dateTimeToParameter);
}

它只是忽略了表值参数。

实体框架是否有任何解决方法可以将表传递给过程?

或者有没有其他方法可以将多条记录传递给存储过程?我知道 Xml 参数,但我想避免这种情况,因为我想传递更大的数据集并且不想引起任何性能问题。

【问题讨论】:

  • 尝试使用 ExecuteSqlCommand 或 'SqlQuery' 而不是 ExecuteStoreQuery,只需更改即可。

标签: c# sql-server entity-framework


【解决方案1】:

实体框架deos不生成调用带有表参数的存储过程的代码。但是,我找到了一种从上下文变量调用 sp 并传递 table 参数的方法,如下所示:

var parameter = new SqlParameter("EmployeeEarnings", datatableEarnings);
parameter.TypeName = "dbo.UDT_EmployeeEarnings";
_context.Database.ExecuteSqlCommand("TimeClock_UpdateTimeClockData @EmployeeEarnings", parameter);

如果您没有为参数定义类型名称,则会引发错误。因此,通过声明一个新的 SqlParameter 然后分配 TypeName 属性来解决这个问题。

_context 是实体框架上下文,我可以通过它执行命令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 2010-10-22
    • 2013-12-29
    • 1970-01-01
    • 2013-05-23
    • 2017-07-16
    • 2011-02-27
    相关资源
    最近更新 更多