实体框架执行SqlCommand批量更新

本文关键字:更新 SqlCommand 框架 执行 实体 | 更新日期: 2023-09-27 18:25:43

出于性能原因,我尝试使用实体框架ExecuteSqlCommand来批量更新数据。ctx.Database.ExecuteSqlCommand(updateQuery, new object[] {newValue} );

但是,我在设置表的"值"字段时遇到问题。它应该将现有值乘以一个因子,但我收到了以下错误:

附加信息:将数据类型nvarchar转换为时出错数字。

newValue = "Value * 56,25";    
String updateQuery = @"UPDATE dbo.BudgetLine_type1_unpivoted set Value = {0} where valueTypeID='Value2' AND Dim2 in ('712','718','722') AND Dim4 = '110' AND Period = 1"
int noRowsAffected = db.Database.ExecuteSqlCommand(updateQuery, new object[] {newValue} );

当将newValue设置为"1"或简单地设置为"Value"(不更改任何内容)时,工作正常

我该怎么做乘法呢?值字段的类型为十进制(28,6)

实体框架执行SqlCommand批量更新

ExecuteSqlCommand传递参数的行为与string.Format不同,因此{0}占位符不正确-您需要在此处设置SQL参数。

如果你想总是将Value乘以一定的量,那么这个量就是变化的量,所以这就是你需要传递的参数。你只需要根据它是否是乘法来调整查询,即set Value = Value * @p0set Value = @p0。我认为您的代码必须知道要设置的值是什么,以及是否要相乘。

我会这样写,类似于MSDN上描述的例子:

decimal newValue = 56.25;
bool multiply = true;
String newValueSql = multiply ? "Value * @p0" : "@p0";
String updateQuery = @"UPDATE dbo.BudgetLine_type1_unpivoted set Value = " + newValueSql
    + " where valueTypeID='Value2' AND Dim2 in ('712','718','722') AND Dim4 = '110' AND Period = 1"
int noRowsAffected = db.Database.ExecuteSqlCommand(updateQuery, newValue);

运行查询时,@p0将被newValue的值替换,并且将是一个十进制值,因此计算有效。