是否可以编写一个创建方法的方法?

时间:2010-06-02 23:04:17

标签: c# mysql visual-studio methods

这看起来似乎没什么好事但希望在我解释我的问题之后你可能会理解我为什么这么问。

是否有可能有一个创建方法及其论证的方法?

问题:

在我当前的项目中,我必须多次调用不同的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;
    }

因为你可以看到那是一团糟

所以我想知道是否有可能编写一个方法来讨论需要插入多少列,然后可以创建一个有很多争论的方法。

我希望你能看到我所得到的东西而且听起来不像是一个傻瓜!

提前致谢

3 个答案:

答案 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

}

答案 1 :(得分:0)

除了@adrianbanks之外,你可以使用c#的var将可变数量的参数传递给你的方法并通过集合进行迭代

答案 2 :(得分:0)

如果你真的想要这样做,那么只需传入一个params KeyValuePair<string,string>[] columns,这将允许你传递任意数量的对(Name / Value),并且你可以在一个数组中访问它们。< / p>

那说我真的建议不要以这种方式构建你的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);
}