2010-06-02 4 views
1

это может показаться неинтересным, но, надеюсь, после того, как я объясню свою проблему, вы можете понять, почему я спрашиваю об этом.Можно ли написать метод, который создает метод?

Возможно ли иметь метод, который создает метод и его аргументы?

проблема:

в моем текущем проекте я должен много раз называют различные операторы SQL, которые ARENT все, что разные.

например, у меня есть один, где я вставляю несколько новых строк, но имеет только 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; 
    } 

, как вы можете видеть, то будет довольно беспорядок

так я гадала, было возможно написать метод, который принять аргумент в отношении того, сколько количеств необходимо было вставить, а затем может создать метод с множеством аргументов.

Надеюсь, вы можете видеть, что я получаю и не просто звучит как плеватель!

заранее спасибо

+1

Почему не просто один метод и передать в словаре пары? – adrianbanks

+0

Хороший вопрос, но тогда у меня нет подсказки по словарю и т. Д., Только студент-студент первого года ^^ –

ответ

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, вы могли бы использовать С # вар перейти в переменное число аргументов вашего метода и 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%. –

+0

Правда, я еще не читал комментарий о студенте uni. Тем не менее, однажды он выйдет из своих заданий Uni и должен хотя бы знать, что есть «лучший способ», а не переносить эти ограничения на более позднюю работу. – fyjham

+0

Действительно оцените это спасибо. но только один маленький вопрос, как я могу назвать эту функцию синтаксисом? getInsertSQL (tablename, извините, что попробовал разобраться с ним, так как вы отредактировали его ответ :) –

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