2010-06-02 87 views
1

這看起來似乎毫不費力,但希望在我解釋我的問題後,你可能會明白爲什麼我問這個問題。是否可以編寫一個創建方法的方法?

是否有可能創建一個方法及其參數?

問題:

在我當前的項目

我不得不多次撥打其所有的arent不同的不同的SQL語句。

例如我有一個插入一些新行但只有2列和另一個插入新行但有12列的地方。

我創建了一個類調用utils.cs,並在那裏我已經整理了許多「得心應手」的方法,如驗證方法,它檢查是否有數字輸入到文本框等

,所以我想好了,而不是具有SQL寫作方法處處生病使一個在那裏,並調用它,當我需要,所以我有,但它目前看起來是這樣的:

public static string getInsertSQL(string tablename, string colOne, string colTwo, string colThree, string colFour, string colFive, string colSix, string colSeven, string colEight, string colNine, string colTen, string colEleven, string colTwelve,bool active, string valueOne, string valueTwo, string valueThree, string valueFour, string valueFive, string valueSix, string valueSeven, string valueEight, string valueNine, string valueTen, string valueEleven) 
    { 
     string strSQL = ""; 
     strSQL += "INSERT INTO " + tablename; 
     strSQL += "(" + colOne + " " + colTwo + " " + colThree + " " + colFour + " " + colFive + " " + colSix + " " + colSeven + " " + colEight + " " + colNine + " " + colTen + " " + colEleven + " " + colTwelve + ")"; 
     strSQL += " values ("+active+", " + valueOne + " " + valueTwo + " " + valueThree + " " + valueFour + " " + valueFive + " " + valueSix + " " + valueSeven + " " + valueEight + " " + valueNine + " " + valueTen + " " + valueEleven + ")"; 

     return strSQL; 
    } 

,你可以看到這就是相當混亂

,所以我想知道,如果它儘可能寫出一種方法就需要插入多少colums進行爭論,然後創建一個包含許多爭論的方法。

我希望你能看到我在做什麼,而不只是聽起來像一個plep!

在此先感謝

+1

爲什麼不只是有一個方法,並將<的ColumnName,ColumnValue>對的字典? – adrianbanks 2010-06-02 23:06:54

+0

好問題,但後來我沒有線索字典等,只有第一年uni學生^^ – 2010-06-02 23:08:25

回答

3

首先,永遠不會在你的例子一樣串聯值共築SQL字符串。你打算自己打開SQL injection attacks

取而代之的是構建parameterized queries

您實際上可以在運行時生成方法或基於某些元信息生成方法。但是,您可能希望查看是否可以通過將參數解析爲單個方法來構建SQL查詢,例如,傳入列名稱值的字典。

這裏是僞代碼,概述過程

public void DoQuery(string table, Dictionary<string, object> columns) 
{ 
    StringBuilder query = new StringBuilder(); 
    query.Append("SELECT "); 
    foreach (KeyValuePair<string, object> kvp in columns) 
    { 
     query.Append(kvp.Key).Append(","); // You need extra logic to not append a trailing comma. Exercise to reader ;-) 
    } 

    // Etc. Look at how to add parameters to your where clause using provided link 

} 
0

繼@adrianbanks,你可以使用C#的變種集合中的參數,以你的方法和itterate變量數傳

0

如果你真的想要做到這一點,然後只需傳入一個params KeyValuePair<string,string>[] columns,這將允許你傳遞儘可能多的對(Name/Value),只要你喜歡,你可以在數組中訪問它們。

這就是說我會認真地建議不要以這種方式構建你的SQL。它對開發很有用,並且有許多非常好的框架(Linq,NHibernate,EntityFramework等),或者即使您不想至少使用參數化查詢。

編輯:既然你說你不確定什麼是字典,我想你可能需要更多的細節。這裏有一個例子考慮到的問題是,即使它不是理想的SQL仍然有效:

public static string getInsertSQL(string tablename, params KeyValuePair<string, string>[] columns) 
{ 
    string strSQL = "INSERT INTO {0} ({1}) VALUES ({2})"; 
    string fields = String.Empty; 
    string values = String.Empty; 
    foreach (KeyValuePair<string, string> column in columns) 
    { 
    if (!String.IsNullOrEmpty(fields)) fields += ", "; 
    if (!String.IsNullOrEmpty(values)) values += ", "; 
    fields += column.Key; 
    values += "\"" + column.Value + "\""; //Highly recommend replacing with parameters, or at least SQL escaping 
    } 
    return String.Format(strSQL, tablename, fields, values); 
} 
+0

除了作爲一個大學生,他們可能會被限制使用某些技術...學習基礎之前學習更抽象的方法。不確定。但另有協議100%。 – 2010-06-02 23:15:51

+0

的確,我還沒有讀過關於uni學生的評論。儘管如此,有一天他會擺脫他的Uni任務,至少應該知道有一種「更好的方式」,而不是將這些限制帶入以後的工作中。 – fyjham 2010-06-02 23:18:45

+0

非常感謝這謝謝。但只有一個小問題,我該如何調用該函數最新的語法呢? getInsertSQL(tablename ,?抱歉,試圖解決它,因爲你編輯它的答案:) – 2010-06-03 00:09:29

相關問題