PDA

View Full Version : مشکل با ado (کمک فوری )



کم حوصله
یک شنبه 16 شهریور 1382, 12:02 عصر
سلام
دوستان من با vb6 و بانک sql 2000 دارم یک برنامه فوق سنگین می نویسم ارتباطات من توسط ADO است الان مشکلی که من پیدا کردم این است که سرعت SELECT و REFRESH کردن های من واقعا پایین امده که بدین صورت که :

یکی از فرمهای برنامه من یک جدول اصلی و 3 جدول وابسته به آن را دارد که جدول اصلی 127 فیلد و جدولهای وابسته هرکدام 14 فیلد دارند ( ضمنا به ازاء هر رکورد در جدول اصلی من 4 رکورد در هر کدام از جدول های وابسته حداقل دارم )

حال که تعداد رکورد های من در جدول اصلی به سیزده هزار رکورد رسیده هنگام لود شده فرم مذکور حدود 55 ثانیه طول می کشد :cry: هنگام Requery هم همین زمان طول می کشد
چرا با بالا رفتن رکورد ها سرعت SELECT کردن بالا می رود یا سرعت requery کردن

در ضمن تخمین زده شده که حداقل رکورد که باید در جدول اصلی وارد شود سیصدو پنجاه هزار رکورد باشد آن موقع چقدر طول خواهد کشید :shock: :cry: :cry:

تو را به خدا کمک فوری

Abbas Arizi
یک شنبه 16 شهریور 1382, 12:10 عصر
من یک دفعه برای تست 500 هزار رکورد توی یک بانک Access قرار دادم. وقتی که خواستم باز کنم حدودا 5 دقیقه طول کشید ولی با DAO تقریبا نصف این زمان طول کشید.
به هر حال راهی که به نظر من میرسه اینه که شما یک جوری قبل از باز شدن Form روی recordset یک فیلتر قرار بدید تا فقط رکوردهایی که در اون زمان نیاز هست باز بشه.

کم حوصله
دوشنبه 17 شهریور 1382, 09:05 صبح
سلام
اولا ا‏قای عریزی عزیز شاید باورتون نشه که الان این اطلاعات روی بانک access است و مقدار آن چهل و نه هزار رکورد است ولی حداکثر 12 ثانیه طول می کشد تا فرم من لود شود :shock: ولی همین ظرفیت را یعنی 49 هزار رکورد را که من با بانک sql منتقل کردم حدود هفت دقیقه طول کشید نا فرم من لود شد :cry: :cry: :cry: آقا چه جوره که می گویند sql قویتر است سرعت بالاتری داره :cry: :cry:

در ضمن یک چیز دیگه برام اتفاق افتاده که توش موندم اونم اینکه این فرم را که به تنهایی توی یک پروژه دیگه باز می کنم برای 45 هزار رکورد فقط 2:25 ثانیه طول می کشد :shock: چرا؟؟؟

چه کنم ؟؟؟؟؟ :cry: :cry:

S.Azish
دوشنبه 17 شهریور 1382, 13:22 عصر
به نظر من مشکل اصلی در ایجاد ایندکس ها هست چون شما جدول خودتون رو با چند جدول دیگه لینک کردید. روی فیلدهایی که با جدولهای دیگه لینک میشن ایندکس بسازید یا اگر براتون ممکنه ساختار خلاصه جدولها رو اینجا بذارید تا بشه راه حل رو راحتتر پیدا کرد.

دوشنبه 17 شهریور 1382, 16:45 عصر
دستور Select ای که نوشتین رو در SQL Query Analyzer اجرا کنین، اگر جواب را سریع به شما نشان داد، مشکل از برنامه ای است که نوشتین و در غیر اینصورت باید ساختار دستور Select و طراحی جدول تون رو تصحیح کنین.

کم حوصله
دوشنبه 17 شهریور 1382, 19:18 عصر
سلام
آقای آذیش عزیز من تقریبا فهمیدم چشه :
زمانی که من پروژه اصلی را باز میکنم قبل از اینکه فرم پدر را باز کنم یک فرم برای گرفتن رمز کاربر باز می کنم که آنجا connection اصلی برنامه را بار گذاری می کنم آخه من توی ماژول یک کانکشن را به صورت public تعریف کردم و در فرم اولیه که بار گذاری می کنم در تمام فرمهای دیگر برای باز کردن rcordset هایم از همان کانکشن استفاده می کنم
برای همین سرعت من پایین بود ولی حال که برای هر فرم یک کانکشن مجزا بار گذاری می کنم سرعت من فوق العاده بالا آمده به صورتی که حالا فرمهایم کمتر از 1 دقیقه لود می شود
چرا؟؟؟؟؟؟؟ :shock:
چه ربطی به کانکشن دارد ؟؟؟؟؟ مگه کار کانکشن چیه ؟؟؟؟؟؟ مگر بارگذاری جداول بر عهده رکوردست نیست ؟؟؟؟؟؟ :(

کم حوصله
سه شنبه 18 شهریور 1382, 20:44 عصر
:cry:
آقا تورا به خدا یکی یک چیزی بگه لنگم آبروم رفت دارن می کشنم :cry: :cry:
کمک بگید چه کنم حالا

S.Azish
چهارشنبه 19 شهریور 1382, 12:46 عصر
درست اینه که هیچ وقت هیچ کانکشنی رو باز نگه نداشت و هر زمان که لازم داشتید همون زمان باز کنید و همون زمان هم ببندید شاید بگید این روش کند میشه ولی در اصل اینطور نیست و OLEDB یا ODBC از تکنیکی استفاده می کنند به نام Connection Pooling که این کاهش سرعت رو جبران میکنه. هر زمان نیاز به یک Recordset یا انجام یک دستور SQL داشتید میتونید مثل روش زیر اونو بگیرید



Option Explicit
Private connectionString As String

Public Function GetRecordSet(ByRef rsResult As ADODB.Recordset, ByVal CommandText As String) As Long
'

Dim cn As ADODB.Connection

Set cn = New ADODB.Connection
With cn
.connectionString = connectionString
.CursorLocation = adUseClient
.Open
End With

If rsResult Is Nothing Then rsResult = New ADODB.Recordset
If rsResult.State = adStateOpen Then rsResult.Close

rsResult.Open CommandText, cn
If Not (rsResult.EOF Or rsResult.BOF) Then
GetRecordSet = rsResult.RecordCount
End If

'Unmark this line if you don't need connected recordsets
'rsResult.ActiveConnection = Nothing

cn.Close
Set cn = Nothing
'
End Function

Public Function ExecuteSQL(ByVal CommandText As String) As Long
'

Dim cn As ADODB.Connection
Dim lngTemp As Long

Set cn = New ADODB.Connection
With cn
.connectionString = connectionString
.CursorLocation = adUseClient
.Open
End With

Call cn.Execute(CommandText, lngTemp)
ExecuteSQL = lngTemp

cn.Close
Set cn = Nothing
'
End Function