小弟目前有一程序,其中要用到如下功能:将取得的dataset数据全盘插入到另外一个数据库(sqlserver)中,我目前是这样写的
......
for(int i,i循环)
{
cmd.cmdtext="insert into xxx values("
cmd.cmdtext+=ds.table[0].rows[i][0].tostring();
cmd.cmdtext+=ds.table[0].rows[i][1].tostring();
cmd.cmdtext+=ds.table[0].rows[i][2].tostring();
cmd.cmdtext+=ds.table[0].rows[i][3].tostring();
cmd.cmdtext+=ds.table[0].rows[i][4].tostring();
cmd.cmdtext+=ds.table[0].rows[i][5].tostring();
.......
cmd.executenonquery();
}现在我发现这样写不够优化,每次操作后sqlserver随着记录插入占用越来越多的内存,我每次数据量又大,少说也几万,然后sqlserver释放内存又非常缓慢,大家有没有比较好的代码或者建议贴一些给我参考参考,谢谢了.

解决方案 »

  1.   

    方法一
    System.Text.StringBuilder sb=new System.Text.StringBuilder()
    for(int   i,i循环) 

    sb.Append(insert   into   xxx   values( "); 
    sb.Append(ds.table[0].rows[i][0].tostring()); 
    sb.Append(ds.table[0].rows[i][1].tostring()); 
    sb.Append(ds.table[0].rows[i][2].tostring()); 
    cmd.CommandText=sb.ToString();
    ....... 
    cmd.executenonquery(); 

      

  2.   

    你用SqlDataAdapter.Update()试试看呢。
    还有,用stringBuider来组合字符串
      

  3.   

    方法二
    DataSet dataSet=new DataSet();
    SqlDataAdapter da=new SqlDataAdapter("select colName from tableName where 1=0",con);
    da.Fill(dataSet)
    SqlCommandBuilder cmd=new SqlCommandBuilder(da)
    da.Update(你的ds)
    注意,两个DataSet的结构要完全一致
      

  4.   

    学习学习
    不过  不知道 yhy0611 方法一 这样写不知道怎么样  
    System.Text.StringBuilder   sb=new   System.Text.StringBuilder() 
    for(int       i,i循环)   
    {   
    sb.Append("insert       into       xxx       values(   ");   
    sb.Append(ds.table[0].rows[i][0].tostring());   
    sb.Append(ds.table[0].rows[i][1].tostring());   
    sb.Append(ds.table[0].rows[i][2].tostring());   
    ........
    sb.Append(") go");
    }
     cmd.CommandText=sb.ToString(); //一次执行多个insert 命令  本人认为这样写可能更好点
    .......   
    cmd.executenonquery();  
      

  5.   

    一次执行多个insert命令?????意思是一下子把几万个insert组织好??这个想法很大胆,呵呵,各位有好建议的继续,我补充下,是sqlserver这个进程占用的内存膨胀,个别情况能膨胀到4-500m
      

  6.   

    可以考虑SqlParameter+StringBuilder,参数化来搞,就不用搞俩一摸一样的DS了,这种方法适合两个表不完全一致的情况,估计你的需求也是不完全一样的吧,否则一个select into就搞了不是么?
      

  7.   

    我这也有一个方法:
    System.Text.StringBuilder       sb=new       System.Text.StringBuilder();
    ArrayList columValuList = null;
    for(int               i,i循环)      
    {      
    sb.Append( "insert               into               xxx               values(       ");      
    sb.Append(?,);            
    sb.Remove(strSql.ToString().LastIndexOf(','), 1);
    sb.Append(")");
    columValuList = new ArrayList();
    columValuList.Add(ds.table[0].rows[i][0].tostring());
    String.Format(strSql.ToString(), columValuList.ToArray());
    ......
    }
    cmd.executenonquery();
      

  8.   

    是的,表结构不同,甚至可以说完全不一样,SqlParameter+StringBuilder可具体说说么
      

  9.   

    不是这么搞吧?建议你用存储过程,然后将你的数据生成你要的结构的XML文件,把这个文件作为参数传进去,然后把这个文件的数据放到一个表变量里。这样用一句话就把数据插进去了。所有的读写操作放在存储过程里,效率应该比在外面拼sql语句高。
      

  10.   

    那倒不如用 insert 表(字段...) select * from 表2 where 条件
      

  11.   

    DECLARE @idoc int
    DECLARE @doc NText
    SET @doc ='
    <ROOT>
    <Customer CustomerID="VINET" ContactName="Paul Henriot">
       <Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
          <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
          <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
       </Order>
    </Customer>
    <Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
       <Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
          <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
       </Order>
    </Customer>
    </ROOT>'
    --Create an internal representation of the XML document.
    EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
    -- Execute a SELECT statement that uses the OPENXML rowset provider.
    INSERT Table
    SELECT    *
    FROM       OPENXML (@idoc, '/ROOT/Customer',1)
                WITH (CustomerID  varchar(10),
                      ContactName varchar(20))
    EXEC sp_xml_removedocument @idoc参考一下。