Можно ли написать метод, который создает метод? - PullRequest
1 голос
/ 03 июня 2010

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

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

проблема:

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

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 03 июня 2010

Прежде всего, никогда не создавайте строку SQL, объединяя значения вместе, как в вашем примере. Вы оставляете себя открытым для атак SQL-инъекций .

Вместо этого постройте параметризованных запросов .

Фактически вы можете генерировать методы во время выполнения или генерировать методы кода на основе некоторой метаинформации. Тем не менее, вы можете посмотреть, сможете ли вы построить свой запрос 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 голосов
/ 03 июня 2010

Если вы действительно хотите это сделать, просто введите params KeyValuePair<string,string>[] columns, это позволит вам передать столько пар (имя / значение), сколько вам нужно, и в функции, к которой вы можете обращаться к ним в массиве.

Тем не менее, я серьезно рекомендую не создавать ваш 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 голосов
/ 03 июня 2010

В дополнение к @adrianbanks, вы можете использовать переменную c #, чтобы передать переменное число аргументов вашему методу и пройти через коллекцию.

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