PDA

View Full Version : ارتباط بین دستورات SQL و زبان برنامه نویسی؟



mahak_f
سه شنبه 21 آذر 1385, 14:11 عصر
راستش مشکلم تو ارتباط بین دستورات SQL و زبان برنامه نویسیه (مثلا VB6)
میخوام از یه فایل txt بخونم و بعد از decode اطلاعات به بانک بریزم. حجم اطلاعات به 5-6 مگابایت هم میرسه (5-6 مگ فقط فایل txt!) سرعت خیلیکمه. برا مثال 3مگ اطلاعات رو تو 2ساعت به بانک ریخت. عملا برنامه غیر قابل استفاده ست!
میتونم از view برا وارد کردن اطلاعات به بانک استفاده کنم؟ یا SP ها؟ نمیدونم وقت تعریف مثلا view تو محیط SQL داده هاییکه هربار تازه میشن و از فایل تو محیط VB میخونم رو چجوری بهش بدم؟

AminSobati
سه شنبه 21 آذر 1385, 14:34 عصر
به نظر من مشکل از ورود اطلاعات به بانک نیست، شاید بیشترین زمان برای Decode تلف میشه. به هر روشی که Insert کنین، نباید این مقدار طول بکشه

mahak_f
سه شنبه 21 آذر 1385, 17:45 عصر
برای Decode هر خط رو میخونه و از روی تعداد کاماها (کاما به عنوان جدا کننده هر قسمت داده هستش) هر قسمت اون خط تو یه متغیر ریخته میشه و بعدش هم به بانک!

AminSobati
سه شنبه 21 آذر 1385, 21:36 عصر
بسیار خوب! چقدر طول میکشه Decode؟ چجوری Insert انجام میدین؟!

mahak_f
چهارشنبه 22 آذر 1385, 09:09 صبح
در قسمتی از برنامم باید یک سری اطلاعات رو (با فرمت txt ) از یه فایل text بخونم و بعد از decode کردن اونا رو در فیلدهای بانک مربوطه بریزم.برای مثال یه رشته از این داده ها به صورت :

$ED,134033,A,3116.5066,N,04850.3040,E,0.00,0.00,03 0905,0,18,1,0,0,*

به عنوان جداکننده فیلدها از هم از کاما استفاده شده. از اول رشته خوانده میشود و با توجه به تعداد کاماها (با استفاده از Switch case )اینکه قسمت خوانده شده کدام فیلد از داده های بانک است مشخص و دیکد میشود. برای decode بعضی بخشهای رشته باید توابع دیگری فراخوانی شوند (مثلا تبدیل تاریخ میلادی به شمسی ...) هر بخش رشته در متغیر مناسب قرار میگیرد و در نهایت داده های یک رشته همه با هم در یک ردیف جدول insert میشوند.
برای decode و وارد کردن 4 MG بایت از این فایل به بانک چیزی در حدود 3 ساعت زمان صرف میشود
برا insert هم از ...insert into استفاده میکنم.

h_baqery
چهارشنبه 22 آذر 1385, 11:34 صبح
با Bulk insert هم امتحان کنید سرعتش بسیار بیشتر است .

AminSobati
چهارشنبه 22 آذر 1385, 16:48 عصر
اگر فقط دستور Insert رو حذف کنید، آیا سرعت خیلی بهتر میشه؟

mahak_f
چهارشنبه 22 آذر 1385, 21:01 عصر
دستورهای نوشتن در بانک رو برداشتم (دستور Insert رو حذف کردم) تا برنامه فقط همون فایل 4 MG (با فرمت txt ) رو بخونه و decode کنه و هر بخش رشته در متغیر مناسب قرار بده. تمام این کارا فقط 7 دقیقه طول کشید!! بنابراین میشه اینجور نتیجه گرفت کندبودن برنامه به مدل پرکردن بانک بر میگرده؟
واسه این کار هم : (تو VB6 )
Dim rst As New ADODB.Recordset
Dim cnn As New ADODB.Connection
Select Case headerstr
Case "$EE"
sqlee = "insert into eventtick( codem,codeoto,coderan,time,valid,lon,ns,lat,ew,spe ed,cource,date,header,overspeed,shetab,enheraf,kha b,tormoz,dooree) values ('" + codem + "','" + codeo + "','" + coderan + "','" + gtime + "','" + valid + "','" + lon + "','" + ns + "','" + lat + "','" + ew + "','" + speednum + "','" + course + "','" + gdate + "','$EE','" + overspeed + "','" + shetab + "','" + enheraf + "','" + khab + "','" + tormoz + "','" + newdoor + "');"


Set rst = cnn.Execute(sql)
Adodc1.Refresh

AminSobati
چهارشنبه 22 آذر 1385, 21:46 عصر
دوست عزیزم کد رو داخل تگ قرار بدین، چون سخت میشه چیزی ازش فهمید

mahak_f
پنج شنبه 23 آذر 1385, 08:30 صبح
دوست عزیزم کد رو داخل تگ قرار بدین، چون سخت میشه چیزی ازش فهمید

چه جوری :کد رو داخل تگ بزارم؟ (معذرت):افسرده:

mahak_f
پنج شنبه 23 آذر 1385, 08:31 صبح
با Bulk insert هم امتحان کنید سرعتش بسیار بیشتر است .

bulk insert ظاهرا میتونه مستقیم فایل رو decode کنه و بانک رو پر کنه. گفتم قبل از ذخیره بعضی بخشهای رشته باید توابع دیگری فراخوانی شوند (مثلا تبدیل تاریخ میلادی به شمسی یا تبدیل ساعت گرینویچ به ساعت ...) این امکان رو داره bulk insert؟

AminSobati
پنج شنبه 23 آذر 1385, 14:14 عصر
خیر (برای رسیدن به 10 کاراکتر!)

mahak_f
دوشنبه 27 آذر 1385, 14:39 عصر
دستورهای نوشتن در بانک رو برداشتم (دستور Insert رو حذف کردم) تا برنامه فقط همون فایل 4 MG (با فرمت txt ) رو بخونه و decode کنه و هر بخش رشته در متغیر مناسب قرار بده. تمام این کارا فقط 7 دقیقه طول کشید!! بنابراین میشه اینجور نتیجه گرفت کندبودن برنامه به مدل پرکردن بانک بر میگرده؟
واسه این کار هم : (تو VB6 )

Dim rst As New ADODB.Recordset
Dim cnn As New ADODB.Connection
Select Case headerstr
Case "$EE"
sqlee = "insert into eventtick( codem,codeoto,coderan,time,valid,lon,ns,lat,ew,spe ed,cource,date,header,overspeed,shetab,enheraf,kha b,tormoz,dooree) values ('" + codem + "','" + codeo + "','" + coderan + "','" + gtime + "','" + valid + "','" + lon + "','" + ns + "','" + lat + "','" + ew + "','" + speednum + "','" + course + "','" + gdate + "','$EE','" + overspeed + "','" + shetab + "','" + enheraf + "','" + khab + "','" + tormoz + "','" + newdoor + "');"

Set rst = cnn.Execute(sql)
Adodc1.Refresh

روش بهینه تری رو میشه راهنمایی کنین؟
eventtick اسم بانکیه که باید با اطلاعات خوانده شده پرش کنم. همه رو هم که باید از ورودی (یعنی فایلی که میخونم ) پرکنم.

h_baqery
دوشنبه 27 آذر 1385, 16:04 عصر
پیشنهاد می دم که از طریق bulk insert یا کدهای DTS فایل رو وارد بانک کنید و بعد عمل Decode رو روی اون جدول انجام بدید .

mahak_f
دوشنبه 27 آذر 1385, 17:39 عصر
پیشنهاد می دم که از طریق bulk insert یا کدهای DTS فایل رو وارد بانک کنید و بعد عمل Decode رو روی اون جدول انجام بدید .

نه متاسفانه این کار عملی نیست. چون علاوه بر اطلاعاتی که از فایل می خونم چیزایی مربوط به اینکه این اطلاعات مربوط به چه کسیه با چه شماره کارمندی و..... رو هم توی اون بانک میریزم.
با این حساب یه با باید بانک رو با رکوردهایی که بعضیاشون null پرمیشن پر کنم. بعد اونا رو Decode کنم و در نهایت بانک رو update کنم!
در حالیکه همونطور که گفتم الگوریتم Decode رو به تنهایی تست کردم وقت زیادی در برابر کل کاد نمیگیره....

AminSobati
دوشنبه 27 آذر 1385, 23:14 عصر
شاید به دلیل رفت و برگشتهای بسیار زیاد بین برنامه شما و سرور زمان داره تلف میشه. اگر با XML میتونین کار کنید، پیشنهاد میکنم همش رو یک XML کنین و بفرستید به SQL Server، اونجا با OPENXML خیلی راحت Insert کنین. کل این کار میشه یک رفت و یک برگشت (صدا زدن یک SP). یا اطلاعات رو مثلا با یک جدا کننده (فرضا /) به هم الحاق کنین و در سمت SQL Server جدا و Insert کنین

sknsphr
سه شنبه 28 آذر 1385, 12:29 عصر
روش بهینه تری رو میشه راهنمایی کنین؟


اگه با هر insert دستور Adodc1.refresh هم اجرا میشه، شاید مشکل از همین باشه. خصوصا تو شبکه و با تعداد رکوردهای زیاد.