2011-06-23 56 views
2

好吧,我使用C#將信息插入到數據庫服務器中的表中。它基於一堆添加到它的if語句創建SQL命令。我有一個問題得到清晰地創建聲明。我明白,要插入語句組合在SQL Server中,我們使用:插入語句組合邏輯

INSERT INTO myTable 
SELECT 'value1', 'value2' 
UNION ALL 
SELECT 'value3', 'value4' 
UNION ALL 
SELECT 
etc 

我的問題是,命令他們,這樣的語句將無論if語句它通過它的工作。例如,

function() 
string sqltext = "INSERT INTO myTable" 
if(cond1) 
{ sqltext=sqltext + "SELECT 'v1', 'v2' UNION ALL" } 
else if (cond2) { 
sqltext = sqltext + "SELECT 'v3', 'v4' UNION ALL" } 

在這種情況下,如果由自己任一條件的回報,該語句將不起作用,因爲該語句將在UNION ALL結束。我希望這是有道理的。思考?

+0

這聽起來像一個潛在的SQL注入漏洞的列表。繼續執行... http://www.unixwiz.net/techtips/sql-injection.html –

+0

請停止這樣做,然後您的代碼在每日wtf結束。編寫存儲過程或使用ORM。 http://thedailywtf.com/Articles/Enterprise_SQL.aspx – kakridge

+0

此代碼完全用於內部使用,所以它只能由管理員訪問。但是,謝謝。我將繼續銘記未來 – Aeonstrife

回答

6

請選擇

string sqltext = "INSERT INTO myTable"; 

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

if(cond1) 
{ 
    selectList.Add("SELECT 'v1', 'v2' UNION ALL"); 
    ... 

最後

string selectStatement = string.Join(" UNION ALL ", selectList.ToArray()); 
sqltext = sqltext + " " + selectStatement; 
+0

這是我的建議,但OP可能不使用C#4.0? – FishBasketGordo

+0

@Fish,C#4.0與什麼有關?從.NET 2.0開始,'string.Join'就已經存在了。 –

+0

@FishBasketGordo'string.Join()'自從.net 2.0以來一直存在,除了他在哪裏說他不使用c#4.0? –

1

生成後從sqltext中刪除「UNION ALL」。

   if(sqltext .Trim().EndsWith("UNION ALL")) { 
        sqltext = sqltext.Remove(s.LastIndexOf("UNION ALL")); 
       } 

此外,作爲一個方面說明,我會建議使用StingBuilder而不是做使用+字符串連接。