插入多列

时间:2017-10-20 21:05:58

标签: c# sql ado.net

我目前需要在数据库中插入一行,但我有很多列,总共11行(没有ID)。我正在使用以下命令:

INSERT INTO table1 (col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11) VALUES (@par1,  @par2,  @par3,  @par4,  @par5,  @par6,  @par7,  @par8,  @par9,  @par10,  @par11)

但是你可以看到它太长了,我无法避免使用列名,因为我仍然有ID。是否有更有效的插入方式?或者也许是一种让它更短的方法?因为我正在做的方式,我还必须逐个添加参数:

myCommand.Parameters.Add(value1, "@par1");

3 个答案:

答案 0 :(得分:0)

与填充任何其他语言的任何数据结构的成员实际上并没有多大区别。如果您没有填充数据结构的每个成员,则必须指定要填充的每个成员,您可以使用基于集合的方式(如SQL)或set object.attribute = value中的单独属性值对指定它。

但是,与任何其他语言一样,您可以编写一个函数或过程来隐藏其中一些细节,这样您只需要传入适当的变量。然后,您只需要为任何给定的场景写出所有详细的代码。

答案 1 :(得分:0)

将所有值放入List中,并使用For循环,并在

中逐个插入List值

答案 2 :(得分:0)

编辑:再次感谢@Sentinel提醒我留意潜在的安全风险。这种方法是语言独立的,但我同意他的建议,即您仍然可以使用myCommand.Parameters.Add(values[N], "@parN");而不是为值构建字符串。

扩展@Javies Insuasti回答。

此答案假定您使用字符串构建SQL查询。

这是一种常见且易于处理的方案。处理此问题(imho)的最简单方法是在字符串中使用标记,创建列和值的数组/列表,并用这些数组/列表的内容替换标记。

using System;

class Program
{

    //defining a blacklist of unwanted terms that should not appear in your column names or value strings
    //This is just for the sake of the example, and there are definitely some statements missing in this array
    static string[] QUERY_BLACKLIST = { "SELECT", "DROP", "INSERT", "DELETE", "UPDATE" };

    static void Main(string[] args)
    {
    //Use markers in your query string
    string query = "INSERT INTO table (:columns:) VALUES (:values:);";
    //define an array of column names to insert for the :columns: marker
    string[] columns = { "ID", "Name", "Age", "Something"};
    //some dummy values. Real code would use a model or something to that effect
    int id = 9;
    string name = "John";
    int age = 12;
    bool something = true;
    //all values should be passed as strings, they will replace the :values: marker
    string[] values = { id.ToString(), name, age.ToString(), something.ToString()};
    query = Program.FillColumnsIntoQuery(query, columns, values);
    Console.WriteLine(query);
    //Output:
    //"INSERT INTO table (ID,Name,Age,Something) VALUES ('9','John','12','true');"

    //example for the blacklist check
    query = "INSERT INTO table (:columns:) VALUES (:values:);";
    //strings with malicious intent behind them
    string[] columns2 =  { "DROP table" };
    string[] values2 = { "DELETE * FROM table" };
    try
    {
        query = Program.FillColumnsIntoQuery(query, columns2, values2);
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
        //Output:
        //"Someone is trying to do evil stuff!"
    }

    Console.ReadLine();
    }

    public static string FillColumnsAndValuesIntoInsertQuery(string query, string[] colums, string[] values)
    {
    //joining the string arrays with a comma character
    string columnnames = string.Join(",", colums);
    //adding values with single quotation marks around them to handle errors related to string values
    string valuenames = "'" + string.Join("','", values) + "'"; ; 

    //we need to check every entry of the blacklist against the provided strings
    foreach(string blacklist in QUERY_BLACKLIST)
    {
        if(columnnames.ToLower().IndexOf(blacklist.ToLower()) >= 0
        || valuenames.ToLower().IndexOf(blacklist.ToLower()) >=0)
        {
            throw new Exception("Someone is trying to do evil stuff!");
        }
    }

    //replacing the markers with the desired column names and values
    return query.Replace(":columns:",columnnames).Replace(":values:", valuenames);
    }
}

如果你想要花哨,可以为字符串类编写扩展方法。你也可以传递标记。您可以编写为您构建查询模板的函数。您可以为该功能选择较短的名称。

可能性无穷无尽: - )。