ورود

View Full Version : لود کردن دیتا بیس با رکورد های بالا در VB



kitcat_m18
جمعه 22 مرداد 1389, 18:43 عصر
ضمن سلام و عرض خسته نباشید و آرزوی قبولی طاعات و عبادات کلیه مسئولین و دوستان زحمتکشم در این بخش می خواستم چند تا از مشکلاتی که در برنامه نویسی VB داشتم را با شما اساتید گرامی درمیان بگذارم:


من برنامه نویسی VB رو به صورت تجربی یاد گرفتم پس اگه سوالاتم ساده و بی محتوا هستن به بزرگواری خودتون عفو کنید
من تا می تونستم تو تاپیک های قبلی جستجو کردم اما نتونستم جواب سوالامو پیدا کنم این چند تا سوال هم پیرو یه برنامه هست که خدمتتون عرض میکنم:


مشکل اول: من یه بانک(مثلا اکسس) دارم که می خوام اونو تو Vb داخل یه DataGrid لود کنم
من از این کد استفاده می کنم:




Dim cnn As New ADODB.Connection
Dim cnn1 As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim ra As New ADODB.Recordset
===============================================
Private Sub CNN.TO.ORCL_Click()
Adodc1.CursorLocation = adUseClient
Adodc1.CursorType = adOpenDynamic
Adodc1.MaxRecords = 1
Adodc1.ConnectionString = "Provider=MSDAORA.1;Password=test;UserID=test;Data Source=GHADIM;Persist Security Info=True"
Adodc1.RecordSource = "select * from GHADIM"
Adodc1.Refresh
EndSub
----------------------------------------------
Private SubCNN.TO.ACCESS_Click()
Adodc2.CursorLocation = adUseClient
Adodc2.CursorType = adOpenDynamic
Adodc2.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CMD1.FileName & ";Mode=ReadWrite;Persist Security Info=False"
Adodc2.RecordSource = "select * From DOS Where FAMCOD<>'send'"
Adodc2.Refresh
End Sub



تو این کد من به یه دیتا بیس اکسس و اوراکل وصل شدم اما مشکلم تو دیتا بیس اکسسه من می خوام با دکمه Browse بتونم دیتا بیس رو انتخاب کنم (که این کارو کردم) اما توی کد نام جدول موجود در دیتا بیسم ثابته(DOS) پس عملا نمی تونم به دیتا بیسی که اسم جدولشو نمی دونم کانکت بشم. لطف کنین در رابطه با گرفتن نام جدول از دیتا بیس کمکم کنین.


مشکل دومم تو لود کردن دیتا بیس با رکورد های بالا تو VB هست دیتا بیسی که می گم رکورد های بالای 160 میلیون رو تو خودش جا داده من الان دارم برای این کار از ADODC و DataGrid استفاده می کنم


برای اینکه اوراکل رو راحت بتونم لود کنم از این کد استفاده کردم:
Adodc1.MaxRecords = 1 و به راحتی هم به اوراکل وصل میشم (1ثانیه) اما تو ACCESS این کد جواب نمیده و میره کل دیتا بیس رو تو DataGrid بارگزاری می کنه که اولا وقت زیادی می گیره و دوما وقتی که اومدم یه دیتا بیس 5 میلیون رکوردی رو بارگزاری کنم پیغام Out Of Memory رو مرحمت فرمودند!!!
شما برای اینکه همچین فایل های حجیمی را داخل دیتا VB لود کنید پیشنهاد و راهکاری برای بنده دارین؟؟؟


و مشکل سومم:
من دارم این دیتا بیس های اکسس رو سطر به سطر تو اوراکل میریزم آخه نتونستم از دستور Insert تو SQL برای تزریق دو تا دیتابیس که از جنس های مختلف (ACCESS و ORACLE) هستند استفاده کنم و برای همین وقت زیادی رو تو تزریق می گیره و مشکل دیگه ای هم که داره اگه این وسط اروری بده باید از دوباره دیتابیس رو شروع به تزریق کرد پس تحمل اطلاعات تکراری موجود در دیتا بیس رو هم باید داشت!!!


برای این مشکل هم راهکاری پیدا کردم که اومدم و هر کدوم از سطر ها رو که ارسال میشد مقدار SEND رو تو یکی از فیلد هاش که بلا استفاده بود می نوشتم اما با این کار سرعت تزریق به اوراکل از 60 رکورد در ثانیه به 20 رکورد کاهش پیدا کرد

و مشکل چهارم: من برای تزریق رکود به رکود از اکسس به اوراکل از یه تایمر استفاده می کنم که خوبم جواب میده اما سرعتش از یه حلقه پایین تره اما وقتی که از حلقه For برای تزریق استفاده می کنم برنامه از لحاظ گرافیکی هنگ می کنه (اما در حال تزریق اطلاعات به دیتا بیس اوراکل هست) که این خودش مقدار اشغال CPU , RAM رو تو سرورم خیلی خیلی بالا برده. آیا برای این مشکل هم راه حلی دارین؟؟؟

با تشکر از دوستان محترم در بخش VB منتظر جواب های شما دوستان عزیر هستم.

kitcat_m18
شنبه 30 مرداد 1389, 11:43 صبح
کسی نیست یه راهنمایی کنه؟؟؟

من خیلی وقته منتظر جواب شما عزیزان هستم :خجالت:

HjSoft
یک شنبه 31 مرداد 1389, 21:27 عصر
برای جلوگیری از هنگ برنامه از DoEvents استفاده کنید .
سوالاتتون چندان هم آسون نیست ، لطف کنید برای هر کدوم یک مبحث تازه ایجاد کنید و یکم سوالات مربوط به تزریق گنگه یعنی متوجه نشدم چرا از Filter و addnew استفاده نمی کنید ؟

MR.Abed
شنبه 06 شهریور 1389, 15:49 عصر
سلام دوست عزیز
برای انتقال اطلاعات از اکسس به اوراکل چرا از #C استفاده نمی کنید .

برای چه عملیاتی می خواهید چند میلیون رکورد را واکشی کنید ؟ دقیق توضیح بده تا چند روش در اختیار جنابعالی بگذارم.

kitcat_m18
یک شنبه 07 شهریور 1389, 11:18 صبح
سلام
ببخشید یه کم دیر جواب دادم گرفتار بودم.:خجالت:

در رابطه با سوالات دوست عزیزم آقای HJSOFT باید بگم که منظور شما رو از استفاده از Filter و Addnew متوجه نشدم اگه ممکنه در قالب کد اینو برام تشریح کنید (ممنون میشم اگه برای DoEvents هم همین کارو کنین)

جناب عابد شما هم میشه مزایای استفاده از C#‎‎‎ رو برای بنده توضیح بدین (دلیل استفاده نکردن بنده بلد نبودن زبان برنامه نویسی C#‎‎‎ می باشد)



برای چه عملیاتی می خواهید چند میلیون رکورد را واکشی کنید ؟ دقیق توضیح بده تا چند روش در اختیار جنابعالی بگذارم.

یه سری اطلاعات تو دیتا بیس های حجیم داشتم که از محیط Dos آوردم تو ویندوز (Convert) که به صورت Access هستند اما الان نیاز دارم که انتقالشون بدم تو اوراکل
همونطور که خدمتتون عرض کردم نتونستم برای دو جنس مختلف از دیتا بیس (Oracle & Access) از دستورات SQL مثل Insert استفاده کنم برای همین رکورد به رکورد تو دیتابیس اوراکل میزنم که وقت گیر شده و کلی هم مشکل برام ایجاد کرده که تو اولین پست دربارشون توضیح دادم.

لطف کنین هر جایی که توضیح بیشتری نیاز داره بفرمایید.:خجالت:

HjSoft
دوشنبه 08 شهریور 1389, 09:48 صبح
سلام ، برای Doevents کافیه که بالای اون قسمت لود برنامه یا کلا ر جایی که فکر میکنید برنامه هنگ میکنه بنویسید Doevents و هیچ کار دیگه ای هم لازم نیست ////
واسه addnew :

rst.addnew
rst.field("name") = rst2.field("name")
rst.update
----------
واسه فیلتر :

rst.filter = "name = '" & txt_name.text & "'"

kitcat_m18
سه شنبه 09 شهریور 1389, 08:54 صبح
ممنون از توضیحات خوبتون الان با استفاده از DoEvents و بر طرف شدن مشکل هنگ از 60 تا رکورد در ثانیه به 100 تا رسیدم :لبخندساده:

اما بازم متوجه نشدم Filter به چه درد من می خوره؟؟؟
من باید بدون استثناء بانک رو عیناً واکشی کنم
من فکر می کنم اگه سورس برنامه ای که نوشتم رو قرار بدم بهتر باشه ببخشید اگه یه کم غیر منطقیه آخه برای ساختار تایمر نوشتم ولی وقتی ساختار DoEvents رو متوجه شدم تو تایمر حلقه گذاشتم.

باز هم ممنون از توضیحات خوبتون اگه روش دیگه ای هم به غیر از کاری که من دارم انجام میدم به ذهنتون میرسه راهنماییم کنین. :خجالت:

HjSoft
سه شنبه 09 شهریور 1389, 09:25 صبح
متاسفانه من Vb6 رو ندارم فعا . شما گفتین که میخواید عملیات تکراری نباشه یعنی یک رکورد تکراری نباشه . خوب با همون فیلتر می تونید تشخیص بدید که تکراریه یا نه . کافیه فیلتر که کردی RecordCount بگیری ببینی اگه مساوی 0 بود عملیات افزودن رو انجام بده .
در اولین فرصت هم سعی میکنم سورستون رو چک کنم .

kitcat_m18
جمعه 12 شهریور 1389, 23:56 عصر
بازم سلام خدمت دوستان عزیز و عرض تشکر از آقا HjSoft عزیز که وقتشون رو به بنده اختصاص دادن و جواب سوال های منو میدن :قلب:
من هنوز از روش فیلتر استفاده نکردم از فکر نکنم که بتونه جواب بده اینجا مشکل داشتن رکورد های بالا و وقت کمه و فکر کنم فیلتر کردن بانک اوراکلی با 160 میلیون رکورد یه کم کار وقت گیری بشه :بامزه:
البته تا تست نکنم نظر نمی دم ایشالا که اینطور نباشه :قهقهه:

در مطالب قبلی ای که خدمتتون ذکر کردم این قسمتم وجود داشت:

برای اینکه اوراکل رو راحت بتونم لود کنم از این کد استفاده کردم:
Adodc1.MaxRecords = 1 و به راحتی هم به اوراکل وصل میشم (1ثانیه) اما تو ACCESS این کد جواب نمیده و میره کل دیتا بیس رو تو DataGrid بارگزاری می کنه که اولا وقت زیادی می گیره و دوما وقتی که اومدم یه دیتا بیس 5 میلیون رکوردی رو بارگزاری کنم پیغام Out Of Memory رو مرحمت فرمودند!!!

لطف می کنید در مورد نشون دادن رکورد های Access به صورت محدود هم راهنماییم کنین؟؟؟
نمی خوام به ترتیب حروف الفبا فیلتر کنم بیشتر می خوام یه روشی پیدا کنم که توش بتونم اول مثلا رکورد 1 تا 100000 رو لود کنم بعد 100001 تا 200000 و الی آخر یعنی صد هزار تا صد هزار تا از اول بانک تا اخر بانک (فیلد Auto Numbe تو بانکم نیست امکان ایجادشم ندارم)
بازم ممنون:قلب: