Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态构造insert语句_C#_Sql_Dynamic_Insert - Fatal编程技术网

C# 动态构造insert语句

C# 动态构造insert语句,c#,sql,dynamic,insert,C#,Sql,Dynamic,Insert,我的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[

我的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创建它,但没有成功。感谢您的帮助。谢谢

这应该可以

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

请注意字符串空值。

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

public class MyCustomColumn
{
    public string ColumnName {get; set;}
    public object Value {get; set;}
}
这样你就可以通过一个数组

CreateGenericInsertFunction(string tableName, MyCustomColumn[] columns)
您可以同样轻松地使用
KeyValuePair
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.

你的问题是什么?或者你希望我们为你编写所有的代码吗?你可以在这里找到一些有用的想法:@patrickhoffman:我想要一些关于研究内容的建议。到目前为止,我看到使用StringBuilder处理了一些类似的情况,我不确定它是否适用于我的情况。看起来不错。然而,对于在MyCustomColumn类中get和set的用途,我有点困惑。你能解释一下吗?看起来不太好。这个代码非常危险。了解SQL注入攻击。