0

出于性能原因,我尝试使用实体框架 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)

4

1 回答 1

0

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

于 2014-10-07T08:57:54.720 回答