對於海量數據的插入和更新,ADO.NET確實不如JDBC做到好,JDBC有統一的模型來進行批操作.使用起來
非常方便:
PreparedStatement ps = conn.prepareStatement("insert or update arg1,args2....");
然後你就可以
for(int i=0;i<1000000000000000;i++){
ps.setXXX(realArg);
.....
ps.addBatch();
if(i%500==0){ //假設五百條提交一次
ps.executeBatch();
//clear Parame Batch
}
}
ps.executeBatch();
這樣的操作不僅帶來極度大的性能,而且非常方便.按說,ADO.NET中,要實現這樣的功能,應該直接在Command接口中
或DataAdapter接口中提供Addbat和CommitBat的API,但ADO.NET的卻並沒有這樣簡單地實現,而是要求開發者通過
復雜的變通方法.
對於大量的插入操作,可以利用一個空的DataTable加入要插入的行,達到一定數量提交後清空該表就行了,
實現起來並不算復雜:
DateTime begin = DateTime.Now;
string connectionString = ......;
using(SqlConnection conn = new SqlConnection(connectionString))...{
conn.Open();
SqlDataAdapter sd = new SqlDataAdapter();
sd.SelectCommand = new SqlCommand("select devid,data_time,data_value from CurrentTest", conn);
sd.InsertCommand = new SqlCommand("insert into CurrentTest (devid,data_time,data_value) "
+ " values (@devid,@data_time,@data_value);", conn);
sd.InsertCommand.Parameters.Add("@devid", SqlDbType.Char, 18, "devid");
sd.InsertCommand.Parameters.Add("@data_time", SqlDbType.Char, 19, "data_time");
sd.InsertCommand.Parameters.Add("@data_value", SqlDbType.Int, 8, "data_value");
sd.InsertCommand.UpdatedRowSource = UpdateRowSource.None;
sd.UpdateBatchSize = 0;
DataSet dataset =