实体框架执行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)
向ExecuteSqlCommand
传递参数的行为与string.Format
不同,因此{0}
占位符不正确-您需要在此处设置SQL参数。
如果你想总是将Value
乘以一定的量,那么这个量就是变化的量,所以这就是你需要传递的参数。你只需要根据它是否是乘法来调整查询,即set Value = Value * @p0
或set 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的值替换,并且将是一个十进制值,因此计算有效。