2017-10-12 69 views
0

我有一個服務,複製數據並做修改等。其中的功能僅僅是直複製刪除和插入對面這是很好的數據庫,方便地實現使用實體,不幸的是更大的查詢成爲很慢,所以我只是想將它作爲原始SQL查詢來運行。SQL參數並插入

這就是現在正在foreach循環的形式,並通過

if(deletes.Count() > 0) 
{ 
    // Build up delete string 
    StringBuilder sqlCommand = new StringBuilder("DELETE FROM RandomTable WHERE "); 

    List<string> rows = new List<string>(); 

    foreach(var item in query) 
    { 
     rows.Add(string.Format("(Key1 = '{0}' AND Key2 = '{1}' AND Key3 = '{2}' AND Key4 = '{3}' AND Key5 = '{4}')", 
           item.Key1, item.Key2, item.Key3, item.Key4, item.Key5)); 
    } 

    sqlCommand.Append(string.Join(" OR ", rows)); 
    sqlCommand.Append(";"); 
    runyoubadthing(sqlCommand); 
} 

建立基於什麼飼料查詢(請注意,我提報價和垃圾,但不現在我知道他們需要參數化(但是上面的服務只是在數據庫之間進行會話,所以技術上不應該需要它,但我仍然希望遵循良好的實踐)。

我的問題是:我怎麼會做上述正確的參數化查詢在那裏它可以作爲一個單一的查詢運行,而不是運行成千上萬的單個刪除的這將需要大量的地獄更久?

邊注:這整個的考驗將是約1000倍,更好地與單次自動遞增的ID,遺憾的是這不是我的數據庫,現在我要處理多達10個主鍵噩夢尋找獨特的數據

+0

如果你的數據庫支持的話,你可以用它代替在不同的參數發送的每個值表值參數。這樣,您可以每次刪除(或插入)一整套而不是一行。但是,請注意,這也意味着如果一個刪除(或插入)失敗,那麼在該數據表中發送的所有內容都將失敗。 –

+0

@ZoharPeled的數據庫是SQL Server 2005中,從有關表值參數的文件似乎開始嘗試2008年試運行,但以失敗這是一個有點開溜的。我可能會考慮把整個事情轉換成直接的數據表,並檢查它的速度 – Rando

+0

你是對的。表值參數在SQL Server 2008中啓動。 –

回答

1

你可以嘗試這樣的事:

var Command = new SQLCommand { 
    CommandText = "DELETE FROM RandomTable WHERE ", 
    Connection = yourConnection 
}; 
var count = 0; 
foreach(var item in query) 
{ 
    Command.CommandText += Command.CommandText.EndsWith("WHERE ")? "": "OR "; 
    Command.CommandText += $"(Key1 = '@{count}0' AND Key2 = '@{count}1' AND Key3 = '@{count}2' AND Key4 = '@{count}3' AND Key5 = '@{count}4')"; 
    Command.Parameters.Add($"@{count}0", [YourDBType]).Value = item.Key1; 
    Command.Parameters.Add($"@{count}1", [YourDBType]).Value = item.Key2; 
    Command.Parameters.Add($"@{count}2", [YourDBType]).Value = item.Key3; 
    Command.Parameters.Add($"@{count}3", [YourDBType]).Value = item.Key4; 
    Command.Parameters.Add($"@{count}4", [YourDBType]).Value = item.Key5; 
    count++; 
} 
Command.Prepare(); 
//Execute Command 

我不認爲有解決不是每個項目執行刪除命令等這個問題沒有更好的方法。

+0

您需要在'foreach'循環中增加'count'。最好在循環中使用'StringBuilder'而不是字符串連接。 –

+0

此外,你不應該有參數名稱的單引號。 –

+0

謝謝@Nullpointer我最可怕的方式我可以將字符串生成器(和你的回答)是最適合的批量刪除,和DataTable bulkinsert進行插入,這意味着現在我有實體提取數據,刪除參數和數據表將制定,Im相當肯定的下一個程序員來看待這個會找到我的家庭地址和毆打我用磚頭 – Rando