2014-10-07 97 views
0

出於性能原因,我試圖使用實體框架ExecuteSqlCommand批量更新數據。 ctx.Database.ExecuteSqlCommand(updateQuery, new object[] {newValue});實體框架ExecuteSqlCommand批量更新

但是我無法設置我的表的值字段。它應該由一個因素乘以現有的價值,但我收到以下錯誤:

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

當設置NEWVALUE爲「1」或簡單的「價值」(不改變任何東西),它工作正常

我應該怎麼做乘法?值域是十進制類型(28,6)

回答

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的值運行查詢時會被替換,將是一個十進制值,因此計算工程。

+0

有時它會是價值=價值*因素和其他時間它會簡單地價值= X所以你的例子不會在這種情況下工作恐怕。我嘗試用@ p0代替{0},但仍然沒有運氣 – JohanLarsson 2014-10-07 09:05:34

+0

好的,已經更新了回答,以考慮到這一點 – Rhumborl 2014-10-07 09:27:52

+0

非常感謝,這沒有辦法。我認爲我的問題是我試圖運行更新時,將「Value * 56.25」存儲爲字符串而不是小數。乾杯! :) – JohanLarsson 2014-10-07 09:54:30