C# 实体框架ExecuteSqlCommand批量更新

C# 实体框架ExecuteSqlCommand批量更新,c#,sql,entity-framework,sql-convert,C#,Sql,Entity Framework,Sql Convert,出于性能原因,我尝试使用实体框架ExecuteSqlCommand批量更新数据ctx.Database.ExecuteSqlCommand(updateQuery,新对象[]{newValue}) 但是,我在设置表的值字段时遇到问题。它应该将现有值乘以一个因子,但我收到以下错误: 其他信息:将数据类型nvarchar转换为时出错 数字的 当将newValue设置为“1”或简单地设置为“Value”(不更改任何内容)时,效果良好 我该怎么做乘法呢?值字段的类型为decimal(28,6)向Exec

出于性能原因,我尝试使用实体框架ExecuteSqlCommand批量更新数据<代码>ctx.Database.ExecuteSqlCommand(updateQuery,新对象[]{newValue})

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

其他信息:将数据类型nvarchar转换为时出错 数字的

当将newValue设置为“1”或简单地设置为“Value”(不更改任何内容)时,效果良好


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

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

如果您希望总是将
乘以某个量,那么该量是变化的,因此这就是您需要传递的参数。您只需根据查询是否为乘法来调整查询,即
set Value=Value*@p0
set Value=@p0
。我假设您的代码必须知道要设置的值是什么以及是否要乘法

我会这样写,类似于以下描述中的示例:


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

有时它将是value=value*factor,而有时它将只是value=X,因此您的示例在这种情况下恐怕不起作用。我尝试用@p0替换{0},但仍然没有太多幸运的机会,这就成功了。我想我的问题是,在尝试运行更新时,我将“Value*56.25”存储在字符串中,而不是十进制。干杯!:)
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} );
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);