2014-10-07 9 views
0

По соображениям производительности я пытаюсь использовать Entity Frameworks ExecuteSqlCommand для массового обновления данных. ctx.Database.ExecuteSqlCommand(updateQuery, new object[] {newValue});Entity Framework ExecuteSqlCommand массовое обновление

Однако у меня возникли проблемы с установкой поля Value моего стола. Он должен умножить имеющееся значение на коэффициент, но я получаю следующее сообщение об ошибке:

Additional information: Error converting data type nvarchar to numeric.

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}); 

При установке новое_значение на «1» или просто «Value» (ничего не меняя) он работает отлично

Как я должен делать умножение? Значение поля имеет тип DECIMAL (28,6)

ответ

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 при выполнении запроса и будет десятичное значение так расчетные работы.

+0

иногда это значение Value = Value *, и в других случаях это будет просто Value = X, поэтому ваш пример не будет работать в этом случае, я боюсь. Я попробовал заменить {0} на @ p0, но до сих пор не повезло – JohanLarsson

+0

ok, обновил ответ, чтобы принять это во внимание. – Rhumborl

+0

Большое спасибо, что сделал трюк. Я думаю, что моя проблема заключалась в том, что я хранил значение «Value * 56.25» в строке, а не в десятичной системе при попытке запустить обновление. Ура! :) – JohanLarsson

Смежные вопросы