大概描述下,C#有string s = 1,2,3,4,5,6,7,8,9,0; 想一次性插入到数据库里面,单次循环一次一次插入的话太慢了,一次插入在几万到十万的数据就非常慢,所以想一次性插入数据库,sql语句这样,insert into table([id],[nameid]) select newid(),'1' union all  select newid(),'2' union all union all  select newid(),'3'     .......,现在就是不知道C#中应该怎么去写循环和数组,因为S的长短不一定,求大神! 数据库C#SQL

解决方案 »

  1.   

    这不太现实吧,这样的sql语句,如果要插入10万条数据,s字符串长度会大于3M,sqlserver允许这么长的sql语句吗?即使可以,执行速度比循环插入快?
      

  2.   

    是不是可以考虑将数据转成dataTable,然后用IDbCommand和DataBase.UpdateDataSet方法将DataTable的数据更新到数据库的某个表里面去
      

  3.   

    s = "1,2,3,...";
    sql = "insert into table([id],[nameid]) " + string.Join(" union all ", s.Split(',').Select(x => "select newid(),'" + x + "'"));
      

  4.   


    s长度我会控制,不超过1000,应该没问题,我自己测试的,如果发1w,我自己切割成10个1000,插入只需要10次,但是循环的话就是1w次,,速度差的很大
      

  5.   

    使用 sql事务Transaction 进行提交
    每1000条进行一次Commit
    看是否有帮助
      

  6.   

    请问是sqlserver数据库吗?可以考虑用SqlBulkCopy
      

  7.   

    先把数据放到DataTable 再用SqlBulkCopy批量插入
      

  8.   

    用SqlBulkCopy或者事物是最好的选择
      

  9.   

    BulkCopy oracle,sqlserver都支持。
      

  10.   

    考虑参数化吧
    你这个不太好  
    每次都需要重新编译SQL语句
    参数化可以1000条或者更多条一次提交事务
      

  11.   

    更正:OleDbDataAdapter.Adapter.Update();
    =>
    OleDbDataAdapter adapter;
    OleDbCommand cmd = new OleDbCommand("insert ...", connection);
    cmd.Parameters.Add("col1", OleDbType.Char, 50, "col1");
    ...
    adapter.InsertCommand = cmd;
    ...
    adapter.Update();