Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.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# 写列表的速度有多快<;对象>;到数据库?_C#_Bulkinsert - Fatal编程技术网

C# 写列表的速度有多快<;对象>;到数据库?

C# 写列表的速度有多快<;对象>;到数据库?,c#,bulkinsert,C#,Bulkinsert,请解释如何使WriteToBase()方法更快,或者如何在不调用每个insert的情况下进行批量插入 class MyClass { public int a; public int b; public int c; } void main() { List<MyClass> mc = new List<MyClass>(); mc.Add(new My

请解释如何使
WriteToBase()
方法更快,或者如何在不调用每个
insert
的情况下进行批量插入

    class MyClass
    {
        public int a;
        public int b;
        public int c;
    }
    void main()
    {
        List<MyClass> mc = new List<MyClass>();
        mc.Add(new MyClass()); //example
        mc.Add(new MyClass());

        WriteToBase(mc);
    }
    void WriteToBase(List<MyClass> mc)
    {
        //Create Connection

        string sqlIns = "INSERT INTO table (name, information, other) VALUES (@name,           @information, @other)";

        SqlCommand cmdIns = new SqlCommand(sqlIns, Connection);
        for (int i = 0; i < mc.Count; i++)
        {
            cmdIns.Parameters.Add("@name", mc[i].a);
            cmdIns.Parameters.Add("@information", mc[i].b);
            cmdIns.Parameters.Add("@other", mc[i].c);
            cmdIns.ExecuteNonQuery();
        }
    }
class-MyClass
{
公共INTA;
公共int b;
公共INTC;
}
void main()
{
List mc=新列表();
mc.Add(new MyClass());//示例
mc.Add(newmyclass());
写库(mc);
}
无效写库(列表mc)
{
//创建连接
string sqlIns=“插入表(名称、信息、其他)值(@name、@information、@other)”;
SqlCommand cmdIns=新的SqlCommand(sqlIns,连接);
对于(int i=0;i

有什么想法吗?

您当前多次访问数据库。所有插入件应仅命中一次

请尝试以下代码:

void WriteToBase(List<MyClass> mc)
{
  //Create Connection
  using (TransactionScope scope = new TransactionScope())
  {
    string sqlIns = "INSERT INTO table (name, information, other) 
                     VALUES (@name, @information, @other)";

    SqlCommand cmdIns = new SqlCommand(sqlIns, Connection);

    for(int i=0;i<mc.Count;i++)
    {
      cmdIns.Parameters.Add("@name", mc[i].a);
      cmdIns.Parameters.Add("@information", mc[i].b);
      cmdIns.Parameters.Add("@other", mc[i].c);
      cmdIns.ExecuteNonQuery();
    }
    scope.Complete();    
  }
}
void WriteToBase(列表mc)
{
//创建连接
使用(TransactionScope范围=新TransactionScope())
{
string sqlIns=“插入到表中(名称、信息、其他)
值(@name、@information、@other)”;
SqlCommand cmdIns=新的SqlCommand(sqlIns,连接);
对于(int i=0;i
void WriteToBase)(列表mc)
{
//创建连接
使用(TransactionScope范围=新TransactionScope())
{
string sqlIns=“插入到表中(名称、信息、其他)
值(@name、@information、@other)”;
SqlCommand cmdIns=新的SqlCommand(sqlIns,连接);

对于(int i=0;i使用SqlBulkCopy。它可以让您高效地大容量加载包含其他源数据的SQL Server表

private static void WriteToBase(IEnumerable<MyClass> myClasses)
    {
        var dataTable = new DataTable();
        dataTable.Columns.Add("name", typeof(string));
        dataTable.Columns.Add("information", typeof(string));
        dataTable.Columns.Add("other", typeof(string));

        foreach (var myClass in myClasses)
        {
            var row = dataTable.NewRow();
            row["name"] = myClass.name;
            row["information"] = myClass.information;
            row["other"] = myClass.other;
            dataTable.Rows.Add(row);
        }

        using var connection = new SqlConnection(Constants.YourConnectionString);
        connection.Open();
        using var bulk = new SqlBulkCopy(connection) {DestinationTableName = "table" };
        bulk.WriteToServer(dataTable);
    }
私有静态void writebase(IEnumerable MyClass)
{
var dataTable=新的dataTable();
dataTable.Columns.Add(“name”,typeof(string));
dataTable.Columns.Add(“信息”,typeof(字符串));
dataTable.Columns.Add(“其他”,typeof(string));
foreach(myClass中的var myClass)
{
var row=dataTable.NewRow();
行[“名称”]=myClass.name;
行[“信息”]=myClass.information;
行[“其他”]=myClass.other;
dataTable.Rows.Add(行);
}
使用var connection=newsqlconnection(Constants.YourConnectionString);
connection.Open();
使用var bulk=newsqlbulkcopy(连接){DestinationTableName=“table”};
bulk.WriteToServer(数据表);
}

FYI:内联SQL是一个坏消息idea@PrisonerZERO OP正在使用参数——我认为SQL语句没有问题。你是在建议所有内容都使用存储过程吗?我读过很多观点,认为存储过程是个坏主意。@PrisonerZERO仅供参考,谷歌刚刚推出了一个可伸缩的数据库(称为扳手)如果没有SPC,以防有人怀疑您需要添加对System.Transactions的引用,则在顶部包括使用System.Transactions的
行…至少我必须这样做。在循环中添加参数将引发错误,因为您要多次添加这些参数。只有值必须在循环中分配。
private static void WriteToBase(IEnumerable<MyClass> myClasses)
    {
        var dataTable = new DataTable();
        dataTable.Columns.Add("name", typeof(string));
        dataTable.Columns.Add("information", typeof(string));
        dataTable.Columns.Add("other", typeof(string));

        foreach (var myClass in myClasses)
        {
            var row = dataTable.NewRow();
            row["name"] = myClass.name;
            row["information"] = myClass.information;
            row["other"] = myClass.other;
            dataTable.Rows.Add(row);
        }

        using var connection = new SqlConnection(Constants.YourConnectionString);
        connection.Open();
        using var bulk = new SqlBulkCopy(connection) {DestinationTableName = "table" };
        bulk.WriteToServer(dataTable);
    }