小弟目前有一程序,其中要用到如下功能:将取得的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释放内存又非常缓慢,大家有没有比较好的代码或者建议贴一些给我参考参考,谢谢了.
......
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释放内存又非常缓慢,大家有没有比较好的代码或者建议贴一些给我参考参考,谢谢了.
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();
}
还有,用stringBuider来组合字符串
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的结构要完全一致
不过 不知道 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();
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();
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参考一下。