بالنسبة لإدراج البيانات الضخمة وتحديثها، فإن ADO.NET ليس في الواقع بنفس جودة JDBC، حيث أن JDBC لديه نموذج موحد للعمليات المجمعة، وهو مناسب جدًا للاستخدام:
PreparedStatement ps = conn.prepareStatement("إدراج أو تحديث arg1,args2....");
ثم يمكنك
ل(int i=0;i<1000000000000000;i++){
ps.setXXX(realArg);
.....
ps.addBatch();
if(i%500==0){ // افترض أنه تم إرسال خمسمائة عنصر مرة واحدة
ps.executeBatch();
// مسح دفعة المعلمة
}
}
ps.executeBatch();
مثل هذه العملية لا توفر أداءً عاليًا للغاية فحسب، بل إنها أيضًا مريحة للغاية، في ADO.NET، لتنفيذ مثل هذه الوظيفة، يجب توفير واجهات برمجة تطبيقات Addbat وCommitBat مباشرة في واجهة الأوامر أو واجهة DataAdapter، ولكن ADO. NET ولكن لا يتم تنفيذه بهذه البساطة، ولكنه يتطلب من المطورين اتباع حلول معقدة.
بالنسبة لعدد كبير من عمليات الإدراج، يمكنك استخدام DataTable فارغًا لإضافة الصفوف المراد إدراجها، ثم مسح الجدول بعد عدد معين من عمليات الإرسال.
ليس الأمر معقدًا جدًا للتنفيذ:
DateTime begin = DateTime.Now;
سلسلة اتصالString = ...؛
باستخدام (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("أدخل في CurrentTest (devid,data_time,data_value)"
+ "القيم (@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 = new DataSet();
sd.Fill(dataset);
عشوائي ص = عشوائي جديد (1000)؛
لـ (int i = 0; i < 100000; i++) ...{
object[] صف = ...{"DEVID"+i,DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),r.Next(1,1000) };
dataset.Tables[0].Rows.Add(row);
إذا (ط % 300 == 0) ...{
sd.Update(dataset.Tables[0]);
dataset.Tables[0].Clear();
}
}
sd.Update(dataset.Tables[0]);
dataset.Tables[0].Clear();
sd.Dispose();
dataset.Dispose();
conn.Close();
}
TimeSpan ts = DateTime.Now - ابدأ؛
messageBox.Show("ts = "+ ts.TotalMillithans);
بالنسبة لهذا الاختبار، استغرق الأمر 28 ثانية لإدراج 100000 قطعة من البيانات، وكان الأداء مثيرًا للإعجاب للغاية، ولكن بالنسبة للتحديثات المجمعة وأمثلة البحث حول العالم، يتم ملء السجلات في DataSet ثم يتم استخراج الصفوف.
للتحديث، فيما يتعلق بالاختبار الذي أجريته مع كمية صغيرة من البيانات، لم يعد ملء 100000 قطعة من البيانات في DataSet يعمل إذا كان الملايين، فكيف يمكنك تشغيلها؟ دفعة واحدة في DataSet المتوسطة؟ بمعنى آخر، ما هي السجلات التي أريد تحديثها والتي يجب تحديدها للاستعلام عن هذه السجلات؟
لذلك ما زلت أستخدم DataTable فارغًا لإضافة السجلات المراد تحديثها:
sd.SelectCommand = new SqlCommand("select devid,data_time,data_value from CurrentTest حيث 1=0"، conn);
// شرط 1=0 يضمن وجود جدول فارغ.
sd.UpdateCommand = new SqlCommand("تحديث مجموعة CurrentTest data_time = @data_time,data_value = @data_value حيث devid = @devid"، conn);
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;
ل(int i=0;i<300;i++){
........................................
dataset.Tables[0].Rows.Add(row);
}
sd.Update(dataset.Tables[0]);
حاول تحديث 300 سجل أولاً. إذا نجح ذلك، فسيتم تحديث كافة السجلات في حلقة، ولكن سيطالبك بأن عملية الإدراج تتطلب InsertCommand لأنه جدول فارغ ثم تتم إضافة RowState.
إذا تم إرسال التحديث إلى قاعدة البيانات في هذا الوقت، فسيتم تنفيذ عملية الإدراج ولا يمكن تحديثه إلى:
ل(int i=0;i<300;i++){
........................................
صف = {املأ القيمة المبدئية}؛
dataset.Tables[0].Rows.Add(row);
}
dataset.AcceptChanges();
ل(int i=0;i<300;i++){
........................................
dataset.Tables[0].Rows[i][x] = "xxxxxxx";
........................................
}
sd.Update(dataset.Tables[0]);
قم أولاً بإدراج البيانات في DataTable، ثم استخدم AcceptChanges() لتعديل RowState إلى UnChanged، ثم قم بتعديل البيانات في الجدول لتغيير الحالة UnChanged.
قم بتغيير DataTable من الحالة الحالية إلى الحالة الأصلية، ثم قم بتحديث صف DataTable الذي يمكنك استخدامه
التحديث ناجح ولكن من غير المناسب حقًا القيام بذلك.
قم بتعديل الفكرة، خذ أولاً 200 إدخال من قاعدة البيانات (حجم التحديث الدفعي)، واحصل مباشرة على DataTable الأصلي.
sd.SelectCommand = new SqlCommand("select top 200 devid,data_time,data_value from CurrentTest"، conn);
مجموعة بيانات DataSet = new DataSet();
sd.Fill(dataset);
استخدم هذه المساحات الـ 200 لوضع بيانات أخرى ليتم تحديثها والاطلاع على:
لـ (int i = 0; i < 100; i++)
{
dataset.Tables[0].Rows[i].BeginEdit();
dataset.Tables[0].Rows[i]["data_time"] = "2222-22-22 22:22:22";
dataset.Tables[0].Rows[i]["data_value"] = 100;
dataset.Tables[0].Rows[i]["devid"] = "DEVID"+(i+10000);//تحديث السجلات من DEVID10000 إلى DEVID10200
dataset.Tables[0].Rows[i].EndEdit();
}
sd.Update(dataset.Tables[0]);
حسنًا، نجح، هاها. استمر في ملء البيانات المراد تحديثها في هذه المساحة، ثم قم بإرسالها عندما تكون ممتلئة. وبهذه الطريقة، لا يستغرق الأمر سوى بضع دورات لتحديث 100000 قطعة من البيانات.
DateTime begin = DateTime.Now;
سلسلة اتصالString = ""؛
باستخدام (SqlConnection conn = new SqlConnection(connectionString))...{
conn.Open();
SqlDataAdapter sd = new SqlDataAdapter();
sd.SelectCommand = new SqlCommand("select top 200 devid,data_time,data_value from CurrentTest"، conn);
مجموعة بيانات DataSet = new DataSet();
sd.Fill(dataset);
عشوائي ص = عشوائي جديد (1000)؛
sd.UpdateCommand = جديد SqlCommand("تحديث CurrentTest"
+ "تعيين data_time = @data_time، data_value = @data_value حيث devid = @devid"، conn)؛
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;
لـ (عدد العمليات = 0؛ العدد <100000؛)
...{
لـ (int i = 0; i < 200; i++,count++)
...{
dataset.Tables[0].Rows[i].BeginEdit();
dataset.Tables[0].Rows[i]["data_time"] = "2222-22-22 22:22:22";
dataset.Tables[0].Rows[i]["data_value"] = 100;
dataset.Tables[0].Rows[i]["devid"] = "DEVID"+count;
dataset.Tables[0].Rows[i].EndEdit();
}
sd.Update(dataset.Tables[0]);
}
dataset.Tables[0].Clear();
sd.Dispose();
مجموعة البيانات.التخلص
http://www.cnblogs.com/Seabiscuit/archive/2010/05/25/1743341.html