【问题标题】:Dynamically construct insert statement [closed]动态构造插入语句[关闭]
【发布时间】:2018-10-18 02:02:21
【问题描述】:

我的插入语句如下所示:

using (OleDbCommand cmd2 = conn2.CreateCommand())
{
    conn2.Open();
    cmd2.CommandText = "INSERT INTO Panel " + "([Symbol Name SE], [Symbol Name EP]) " + "VALUES(@Type01, @Type02)";
    cmd2.Parameters.AddRange(new OleDbParameter[]
    {
        new OleDbParameter("@Type01", variable1),
        new OleDbParameter("@Type02", variable2),
    });
    cmd2.ExecuteNonQuery();
    conn2.Close();
}

我想将其转换为通用插入函数,我可以将表名、多个列和值作为数组传递给该函数,并且该函数将构造插入语句并执行它。我确实尝试使用 StringBuilder 创建它,但我无法成功。任何帮助表示赞赏。谢谢!

【问题讨论】:

  • 您的问题是什么?还是您希望我们为您编写所有代码?
  • 你可以在这里找到一些有用的想法:samsaffron.com/archive/2012/01/16/…
  • @PatrickHofman:我想要一些关于调查内容的指示。到目前为止,我看到使用 StringBuilder 处理的情况有些类似,我不确定它是否适用于我的情况。

标签: c# sql dynamic insert


【解决方案1】:

应该这样做。

  public void dbQuery(string tablename, string[] columns, string[] values)
    {
        OleDbConnection conn2 = new OleDbConnection();
        using (OleDbCommand cmd2 = conn2.CreateCommand())
        {
            conn2.Open();
             StringBuilder build = new StringBuilder($"INSERT INTO {tablename} {string.Join(",",columns)}");

            foreach (string paramValue in values)
            {
                int count = 0;
                string paramName = $"@Type0{count.ToString()}";
                build.Append(paramName);
                 cmd2.Parameters.Add(
                 new OleDbParameter(paramName, paramValue.ToString()),
            );

                count++;
            }
            cmd2.CommandText = build.ToString();
            cmd2.ExecuteNonQuery();
            conn2.Close();
        }
    }

请自行处理字符串 null/空值。

【讨论】:

    【解决方案2】:

    我建议您使用一个自定义类来处理您的列/值管理,就像这样;

    public class MyCustomColumn
    {
        public string ColumnName {get; set;}
        public object Value {get; set;}
    }
    

    这样就可以传入一个数组;

    CreateGenericInsertFunction(string tableName, MyCustomColumn[] columns)
    

    您可以轻松地使用KeyValuePairTuple,但自定义类在可扩展性方面为您提供了更大的灵活性。

    然后你可以做类似的事情;

    string colList = "";
    string valList = "";
    foreach (var col in columns)
    {
        if (colList.length == 0)
        {
            colList += ", " + col.ColumnName;
        }
        else
        {
            colList += col.ColumnName;
        }
    
        // repeat for Value
    }
    // Finally, join it all together.
    

    【讨论】:

    • 看起来不错。但是,对于 MyCustomColumn 类中 get 和 set 的用途,我有点困惑。你能解释一下吗?
    • 看起来不太好。这段代码非常危险。阅读 SQL 注入攻击。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多