Untuk penyisipan dan pembaruan data dalam jumlah besar, ADO.NET memang tidak sebaik JDBC. JDBC memiliki model terpadu untuk operasi batch. Sangat nyaman untuk digunakan:
PreparedStatement ps = conn.prepareStatement("masukkan atau perbarui arg1,args2....");
maka kamu bisa
untuk(int i=0;i<1000000000000000;i++){
ps.setXXX(realArg);
.....
ps.addBatch();
if(i%500==0){ //Misalkan lima ratus item dikirimkan satu kali
ps.executeBatch();
//hapus Parame Batch
}
}
ps.executeBatch();
Operasi seperti itu tidak hanya menghasilkan kinerja yang sangat tinggi, tetapi juga sangat nyaman. Biasanya, di ADO.NET, untuk mengimplementasikan fungsi seperti itu, API Addbat dan CommitBat harus disediakan langsung di antarmuka Command atau antarmuka DataAdapter, tetapi ADO. Namun hal ini tidak diimplementasikan secara sederhana, namun mengharuskan pengembang untuk melalui solusi yang rumit.
Untuk operasi penyisipan dalam jumlah besar, Anda bisa menggunakan DataTable kosong untuk menambahkan baris yang akan disisipkan, lalu menghapus tabel setelah sejumlah pengiriman tertentu.
Penerapannya tidak terlalu rumit:
DateTime mulai = DateTime.Sekarang;
string koneksiString = ...;
menggunakan(SqlConnection samb = new SqlConnection(connectionString))...{
samb.Buka();
SqlDataAdapter sd = baru SqlDataAdapter();
sd.SelectCommand = new SqlCommand("pilih devid,data_time,data_value from CurrentTest", samb);
sd.InsertCommand = new SqlCommand("masukkan ke CurrentTest (devid,data_time,data_value) "
+ "nilai (@devid,@data_time,@data_value);", samb);
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;
Kumpulan data = Kumpulan Data baru();
sd.Isi(kumpulan data);
R acak = Acak baru (1000);
untuk (int i = 0; i < 100000; i++) ...{
objek[] baris = ...{"DEVID"+i,DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),r.Next(1,1000) };
kumpulan data.Tabel[0].Baris.Tambahkan(baris);
jika (i % 300 == 0) ...{
sd.Update(kumpulan data.Tabel[0]);
kumpulan data.Tabel[0].Hapus();
}
}
sd.Update(kumpulan data.Tabel[0]);
kumpulan data.Tabel[0].Hapus();
sd.Buang();
kumpulan data.Buang();
samb.Tutup();
}
TimeSpan ts = DateTime.Sekarang - mulai;
MessageBox.Show("ts = " + ts.TotalMillidetik);
Untuk pengujian ini, saya membutuhkan waktu 28 detik untuk memasukkan 100.000 data. Performanya cukup mengesankan. Namun untuk pembaruan batch dan contoh pencarian di seluruh dunia, catatan diisi ke dalam DataSet dan kemudian baris-barisnya diekstraksi.
Untuk update, sejauh pengujian saya dengan sejumlah kecil data, mengisi 100.000 data ke dalam DataSet tidak lagi berfungsi. Jika jutaan, bagaimana cara mengoperasikannya? dimasukkan ke dalam DataSet? Dengan kata lain, catatan mana yang ingin saya perbarui harus dipilih untuk menanyakan catatan ini?
Jadi saya masih menggunakan DataTable kosong untuk menambahkan catatan yang akan diperbarui:
sd.SelectCommand = new SqlCommand("pilih devid,data_time,data_value dari CurrentTest di mana 1=0", samb);
//Kondisi 1=0 menjamin tabel kosong.
sd.UpdateCommand = new SqlCommand("perbarui CurrentTest set data_time = @data_time,data_value = @data_value di mana devid = @devid", samb);
sd.UpdateCommand.Parameters.Add("@data_time", SqlDbType.Char, 19, "data_time");
sd.UpdateCommand.Parameters.Add("@data_value", SqlDbType.Int, 4, "data_value");
sd.UpdateCommand.Parameters.Add("@devid", SqlDbType.Char, 20, "devid");
sd.UpdateCommand.UpdatedRowSource = UpdateRowSource.None;
sd.UpdateBatchSize = 0;
untuk(int i=0;i<300;i++){
........................
kumpulan data.Tabel[0].Baris.Tambahkan(baris);
}
sd.Update(kumpulan data.Tabel[0]);
Coba perbarui 300 catatan terlebih dahulu. Jika berhasil, ini akan memperbarui semua catatan dalam satu lingkaran, tetapi akan meminta bahwa operasi penyisipan memerlukan InsertCommand karena ini adalah tabel kosong dan kemudian operasi Tambahkan Baris.
Jika Pembaruan dikirim ke database saat ini, operasi penyisipan dilakukan dan tidak dapat diperbarui ke:
untuk(int i=0;i<300;i++){
........................
baris = {isikan nilai yang diinisialisasi};
kumpulan data.Tabel[0].Baris.Tambahkan(baris);
}
kumpulan data.TerimaPerubahan();
untuk(int i=0;i<300;i++){
........................
kumpulan data.Tabel[0].Baris[i][x] = "xxxxxxx";
........................
}
sd.Update(kumpulan data.Tabel[0]);
Pertama-tama masukkan data ke dalam DataTable, lalu gunakan AcceptChanges() untuk mengubah RowState menjadi UnChanged, lalu ubah data dalam tabel untuk mengubah status UnChanged.
Ubah DataTable dari status Saat Ini menjadi Asli, lalu perbarui Baris DataTable, yang bisa Anda gunakan
Pembaruan berhasil. Tapi sungguh merepotkan untuk melakukannya.
Sesuaikan idenya, pertama ambil 200 entri dari database (ukuran pembaruan batch), dan langsung dapatkan DataTable Asli.
sd.SelectCommand = new SqlCommand("pilih 200 devid teratas,data_time,data_value dari CurrentTest", samb);
Kumpulan data = Kumpulan Data baru();
sd.Isi(kumpulan data);
Gunakan 200 ruang ini untuk memasukkan data lain yang akan diperbarui dan lihat:
untuk (int saya = 0; saya < 100; saya++)
{
kumpulan data.Tabel[0].Baris[i].BeginEdit();
kumpulan data.Tabel[0].Baris[i]["data_time"] = "22-22-2222 22:22:22";
kumpulan data.Tabel[0].Baris[i]["nilai_data"] = 100;
dataset.Tables[0].Rows[i]["devid"] = "DEVID"+(i+10000);//Perbarui catatan dari DEVID10000 ke DEVID10200
kumpulan data.Tabel[0].Baris[i].EndEdit();
}
sd.Update(kumpulan data.Tabel[0]);
Oke sukses haha. Terus isi data yang akan diupdate ke space ini, dan submit jika sudah penuh. Dengan cara ini, hanya perlu beberapa siklus untuk mengupdate 100.000 data.
DateTime mulai = DateTime.Sekarang;
string koneksiString = "";
menggunakan(SqlConnection samb = new SqlConnection(connectionString))...{
samb.Buka();
SqlDataAdapter sd = baru SqlDataAdapter();
sd.SelectCommand = new SqlCommand("pilih 200 devid teratas,data_time,data_value dari CurrentTest", samb);
Kumpulan data = Kumpulan Data baru();
sd.Isi(kumpulan data);
R acak = Acak baru (1000);
sd.UpdateCommand = new SqlCommand("perbarui CurrentTest "
+ " atur data_time = @data_time,data_value = @data_value di mana devid = @devid", samb);
sd.UpdateCommand.Parameters.Add("@data_time", SqlDbType.Char, 19, "data_time");
sd.UpdateCommand.Parameters.Add("@data_value", SqlDbType.Int, 4, "data_value");
sd.UpdateCommand.Parameters.Add("@devid", SqlDbType.Char, 20, "devid");
sd.UpdateCommand.UpdatedRowSource = UpdateRowSource.None;
sd.UpdateBatchSize = 0;
untuk (int hitungan = 0; hitungan < 100000;)
...{
untuk (int i = 0; i < 200; i++,hitung++)
...{
kumpulan data.Tabel[0].Baris[i].BeginEdit();
kumpulan data.Tabel[0].Baris[i]["data_time"] = "22-22-2222 22:22:22";
kumpulan data.Tabel[0].Baris[i]["nilai_data"] = 100;
kumpulan data.Tabel[0].Baris[i]["devid"] = "DEVID"+hitungan;
kumpulan data.Tabel[0].Baris[i].EndEdit();
}
sd.Update(kumpulan data.Tabel[0]);
}
kumpulan data.Tabel[0].Hapus();
sd.Buang();
kumpulan data.Buang
http://www.cnblogs.com/Seabiscuit/archive/2010/05/25/1743341.html