代码之家  ›  专栏  ›  技术社区  ›  WynDiesel

实体框架用户定义表类型过程

  •  1
  • WynDiesel  · 技术社区  · 8 年前

    我有一个解决方案,通过C的数据表批量加载数据,如下所示:

    private void LoadRemittanceLines(DataTable dt, EiseBEDbEntities context)
    {
        var param = new SqlParameter("Payments", SqlDbType.Structured)
        {
            Value = dt,
            TypeName = "dbo.udtRAPayment",
            Direction = ParameterDirection.Input
        };
        var r = context.Database.ExecuteSqlCommand("EXEC spRAPaymentInsertBulk", param);
    }
    

    行激发,没有错误,但表不生成任何结果。我分析了数据库,捕获了执行的代码。下面是一个总结的、屏蔽的示例:

    --THIS IS ADDED BY ME TO CLEAR THE TABLE
    delete from EiseBEDb..RAPayment
    
    declare @p3 dbo.udtRAPayment
    insert into @p3 values(1234879,987654,1,123.49,'2017-09-20 00:00:00','2017-09-20 00:00:00',NULL,0,'2018-07-22 00:00:00',10,0,NULL,NULL,1,N'This is a long string',NULL,NULL,NULL,N'',N'',N'1234',N'','2017-09-12 00:00:00',NULL,NULL)
    
    --THIS CODE YIELDS RESULTS
    --EXEC spRAPaymentInsertBulk @Payments=@p3
    
    --THIS CODE YIELDS NO RESULTS
    exec sp_executesql N'EXEC spRAPaymentInsertBulk',N'@Payments [dbo].[udtRAPayment] READONLY',@Payments=@p3
    
    --THIS IS ADDED BY ME TO CHECK THE DATA
    select * from EiseBEDb..RAPayment
    

    我错过了什么,还有什么方法可以让我通过这个?我能想到的唯一解决方案是不使用ef传递数据,而是手动连接到db,结束调用工作代码行。

    这里是spraPaymentInsertBulk,由于保密性而省略了字段名。

    CREATE PROCEDURE [dbo].[spRAPaymentInsertBulk]
    (
        @Payments udtRAPayment readonly
    )
    AS
    begin
        insert into RAPayment (Field1, field2)
        select Field1, field2
        from @Payments p 
    
    end
    

    我正在使用SQL Server 2017。

    1 回复  |  直到 8 年前
        1
  •  0
  •   WynDiesel    8 年前

    我的问题是我通过的文本,这解决了问题:

    var r = context.Database.ExecuteSqlCommand("exec spRAPaymentInsertBulk @Payments", param);
    
    推荐文章