PDA

View Full Version : ذخیره اطلاعات با استفاده از ado.net



sunn789
چهارشنبه 15 تیر 1390, 22:52 عصر
سلام
اول بگم میخوام چه کنم
من فایل دارم حدود 1800000 خط که بلوک بندی شده و تکرار میشه مثل خطهای زیر
fn=ama242 blk_no=1
n_clg=3232958988 clg_cat=02 n_cld=09122222323
date=04/25/11 tm=14:47:28 dur=0000217
rn_ic= rn_og=vhst tarf=0000062
mbi=021 cl_cat=02
]
تقریباً 300000 از این بلوک ها داریم یه کد نوشتم برا خوندن آنا و ذخیره در متغیر های محلی
یکی از بلوکهای خوندن اطلاعات شبیه به اینه
string line;
while ((line =astr.ReadLine())!= null)
{
tbl_ama ama = new tbl_ama();
textBlock2.Text ="زمان شروع حواندن اطلاعات"+ DateTime.Now.ToShortTimeString();
if (line.Contains("blk_no"))
{
int index_fn = line.IndexOf("fn");
fn = line.Substring(index_fn + 3, 6);

ama.fn = fn;
// textBlock2.Text +="\n"+"fn = " +fn;
found++;
//exline = found;
}
خوب حالا ی مغیر هایی دارم که در حلقه while پر میشن
اما برا ذخیره من یک شی از EntityMode ساختم اینجوری
CDBEntities db = new CDBEntities();
حالا میخوام اطلاعات رو بریزم تو بانک لطلاعاتی که ستونهایی رو هم نام با متغیر هام تو یک جدول تو بانک اطلاعاتیم تعریف کردم
ام ابه نظر شما چه جوری؟

sunn789
شنبه 18 تیر 1390, 18:45 عصر
سلام
اینکه اطلاعات رو انتقال بدم به بانک با استفاده از ado انجام دادم اما یک مشکل اینکه باید برنامه من بیش از 1800000 خط رو بخونه و در بانک ذخیره کنه نمیدونم حد اکثر رکوردی که میشه در sql ذخیره کرد چه قدره اما برا ذخیره این اطلاعات حدود یک ساعت وقت میبره راه حل چیه

PetekDincos
شنبه 18 تیر 1390, 19:06 عصر
با سلام
حداکثر اندازه دیتابیس Sql Server برابر 1,048,516 ترابایته و تعداد رکوردی که در یک جدول می شه ذخیره کرد محدودیتی نداره فقط بایستی اندازه جدول هات از این اندازه ای که گفتم نبایستی بیشتر بشه و برای ذخیره هر تعداد رکورد شما در داخل یک حلقه اگر از ORM ها استفاده می کنید می تونید مثلا با یک شرط که هر 1000 تا 1000 تا entity که به Context ات اضافه کردی از متد SaveChange() استفاده کنی چون اگه بذاری این متد رو بعد از حلقه استفاده کنی بسته به سیستمت حالت Overflow ممکنه رخ بده با تشکر

sunn789
شنبه 18 تیر 1390, 22:02 عصر
از جواب سوال اول متشکر
اما دومی من Overflow نداشتم فقط اینکه ذخیره نزدیک به 300000 رکورد که از 19000000 خط کد میخونه نزدیک به یک ساعت طول میکشه میگم ایا راه حلی وجود داره که برنامه همون چند ثنیه که روی savechange() مکث میکنه انجام نده و تا اطلاعات رو میخونه خود به خود ذخیره بشه فکر کنم از از theared بشه استاده کرد اما راستش رو بخوایی تا به حال استفاده نکردم این چند روز هم خوندم در بارش اما باز هم نشد
کمک

PetekDincos
شنبه 18 تیر 1390, 23:35 عصر
با سلام
برای این کار شما می تونید از BackgroundWorker استفاده نمایید و با یک ProgressBar مراحل ذخیره شدن این 300000 رکورد را نمایش دهید اگر دقیقا این تعداد رکورد را ذخیره می کنید من یک نمونه نوشتم که نشون می ده مراحل کار رو اما اگر تعداد رکوردی رو که می خواهید ذخیره کنید مشخص نیست می تونید خاصیت IsInDeterminate کنترل ProgressBar رو True قرار بدید و در DoWork قسمت _bw.ReportProgress(i) رو بردارید و در متد Complete این خاصیت رو False کنید و در ضمن من از ORM EF استفاده کردم و چون اندازه دیتابیس زیاد می شد و تو آپلود مشکل می شد خودتون یک دیتابیس به نام Sample ایجاد کنید و یک جدول به نام Table1 که دارای فیلدهای ID برابر int و PK و فیلدهای Name,Family,Address که به ترتیب nvarchar 50,50,100 می باشد ایجاد نمایید با تشکر