实体框架ExecuteSqlCommand批量更新

时间:2014-10-07 08:49:18

标签: c# sql entity-framework sql-convert

出于性能原因,我尝试使用Entity Frameworks 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-field的类型为decimal(28,6)

1 个答案:

答案 0 :(得分:0)

将参数传递给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的值,并且将是十进制值,因此计算有效。