代码之家  ›  专栏  ›  技术社区  ›  Inception

动态构造insert语句[关闭]

  •  -2
  • Inception  · 技术社区  · 6 年前

    我的insert语句如下所示:

    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();
    }
    

    我想将其转换为一个通用的insert函数,我可以将一个表名、多个列和值作为数组传递给该函数,该函数将构造insert语句并执行它。我确实尝试过用StringBuilder创建它,但没有成功。非常感谢您的帮助。谢谢

    2 回复  |  直到 6 年前
        1
  •  0
  •   Liquid Core    6 年前

    这应该可以做到。

      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();
            }
        }
    

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

        2
  •  -1
  •   Trent    6 年前

    我建议您使用一个自定义类来处理列/值管理,如下所示;

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

    这样你就可以通过一个数组;

    CreateGenericInsertFunction(string tableName, MyCustomColumn[] columns)
    

    您可以使用 KeyValuePair 或a Tuple 但是定制类在可扩展性方面给了您更多的灵活性。

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

    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.