PDA

View Full Version : طرز استفاده از Query Sql به جای Filter برای فیلتر یک Recordset ؟



kasmaii61
سه شنبه 08 اسفند 1385, 12:41 عصر
سلام دوستان
من یک بانک اطلاعاتی Sql Server دارم که از طریق Ado از برنامه به اون متصل شدم[با زیاد شدن تعداد رکوردهای یکی از جداول بانک(8000 رکورد) سرعت بازیابی اطلاعاتی از اون به شدت کاهش پیدا کرده تا اونجا که من فهمیدم این کاهش سرعت تو جاهایی که از دستور Recorset.Filter استفاده کردم اتفاق افتاده. عزیزی گفت که با جایگزینی دستورات Query Sqlبه جای Filter این مشکل تا حد زیادی حل میشه
اول می خواستم بدونم آیا این درست یا نه؟
بعدم می خواستم بدونم یک دستور Filter رو چه جوری میشه با یک دستور Sql Query ( دستورات شامل Select From Where ) جایگزین کرد
مثلا معادل این دستور چیه ؟
ِDbrst1.Filter = " id = "' & VarId & "'" ;k
پیشاپیش از کمکتون ممنون

zerobit-ltd
سه شنبه 08 اسفند 1385, 15:11 عصر
حرف اون عزیز کاملا درسته.
شما می تونید یه command بسازید و query خودتون رو تو خاصیت commandtext اون بدبد. بعد نتیجه اجرای اون رو تو یه رکوردست بریزید.


cmd.commandtext = "select * from Table where ID = " + VarID
set rs = cmd.execute
راه حل بهتر استفاده از stored procedure هستش که مبحث خیلی گسترده ای داره. اگر search کنی، مطالب کاملی راجع بهش می تونی پیدا کنی.

kasmaii61
سه شنبه 08 اسفند 1385, 22:23 عصر
دوست عزیز از کمکت ممنون منتها از خط دوم این Error رو می گیره :

the connection cannot be used to perform this opertaion.it is either closed or invalid in this context

zerobit-ltd
چهارشنبه 09 اسفند 1385, 09:23 صبح
خوب شما اول باید یه چند خط کد دیگه هم بنویسی.


dim cn as new adodb.connectionDim cn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim rs As New ADODB.Recordset
------------------------------------
cn.ConnectionString = "ConnectionString"
cn.Open
cmd.ActiveConnection = cn
cmd.CommandText = "select * from Table1"
Set rs = cmd.Execute
.
.
.
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing

kasmaii61
چهارشنبه 09 اسفند 1385, 18:30 عصر
دوست عزیز ممنون مشکلم حل شد این خط رو فراموش کرده بودم :
cmd.ActiveConnection = cn
حالا یه سوال دیگه این باز و بسته کردن Recordset و Adodc هم خیلی زمان می بره راهی برای اونم داری؟
بازم از کمکت ممنون

zerobit-ltd
پنج شنبه 10 اسفند 1385, 09:37 صبح
دیگه چاره ای نیست. این زمان رو باید تحمل کرد.

kasmaii61
جمعه 11 اسفند 1385, 10:57 صبح
آقا دم شما گرم . کمک کردی واقعا مرسی

kasmaii61
یک شنبه 27 اسفند 1385, 11:47 صبح
آقا من یه مشکل دیگه پیدا کردم :

Cmd.ActiveConnection = dbcon
Cmd.CommandText = "SELECT * FROM information WHERE companyname = " + Trim(Text1.Text)
Set dbrst1 = Cmd.Execute

فیلد companyname یه فیلد از نوع nchar ولی وقتی این کد رو اجرا می کنم دو نوع Error بهم میده
وقتی عبارت Text1.text یه کلمه ای باشه عبارت رو بر می گردونه میگه همچین Column وجود نداره
اگرم بیشتر از یه کلمه باشه عبارت رو بر می گردونه این Error رو میده

Incorrect Syntax near

من فکر میکنم اصلا عبارت text1.text رو به عنوان یه عبارت text بررسی نمی کنه
فکر می کنید مشکل از کجاست؟

حامد مصافی
دوشنبه 28 اسفند 1385, 16:30 عصر
اینو امتحان کن


Cmd.CommandText = "SELECT * FROM information WHERE companyname='" + Trim(Text1.Text) + "'"

kasmaii61
سه شنبه 29 اسفند 1385, 14:06 عصر
سلام دوست عزیز BlackDal
ممنون از اهنماییت مشکل موقتا حل شده
منتها الان RecorCount که میگیری از Recordset مقدار منفی یک رو بر می گردونه یعنی نمی تونه تعداد رکورداشو محاسبه کنه گشتم ولی متوجه نشدم مشکل از کجاست ممکن کمکم کنید
dbrest1.RecordCount = -1 ؟؟؟
اگر Refrence مناسبی هم دارین در این رابطه ممنون میشم معرفی کنید که این قدر مزاحم نشم

حامد مصافی
سه شنبه 29 اسفند 1385, 16:19 عصر
سلام

این مسئله به کرسر مورد استفاده شما مربوط میشه
ممکنه بفرمایید از چه نوع کرسری استفاده می کنید؟؟

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

اما اگر می خواهید بدون تغییر کرسر به این موضوع برسید بهتره که قبل از گرفتن تعداد رکورد ها با متد MoveLast به انتهای جدول بروید و پس از آن تعداد رکورد ها را بگیرید

kasmaii61
چهارشنبه 01 فروردین 1386, 15:01 عصر
سلام
دوست عزیز CurserType روخودش Default در نظر میگیره یعنی :AdOpenForwardOnly
و من هم نمی تونم تغییرش بدم
چون اگردستور Dbrst1.CurserType = AdOpenDynamic رو قبل از دستور Set dbrst1 = Cmd.Execute قرارش بدم خودش وقتی Set میکنه دوباره به Default تغییرش میده و وقتی بعد از این دستور هم به کارش می برم Error میده و میگه بعد از Open کردن Recordset این دستور مجاز نیست
ممکنه راهمنماییم کنید که چه جوری می تونم CurserType رو به حالت Dynamic یا KeySet تغییر بدم
راستی دستور MoveLast رو هم قبول نمی کنه و این Error رو میده :

Rowset does not Support fetching backward

حامد مصافی
چهارشنبه 01 فروردین 1386, 20:50 عصر
سلام

کد صفحه قبل شما رو به اینصورت تغییر دادم، ببینید:



Dim cn As New ADODB.Connection
'Dim cmd As New ADODB.Command : Dont need that!
Dim rs As New ADODB.Recordset
'------------------------------------
cn.Open "ConnectionString"
rs.Open "select * from Table1", cn, adOpenDynamic

'... Put your code here

rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing



راستی دستور MoveLast رو هم قبول نمی کنه و این Error رو میده :
در کرسر ForwardOnly که نمیشه به انتهای جدول رفت!

kasmaii61
چهارشنبه 01 فروردین 1386, 23:23 عصر
دوست عزیز از کمکت ممنون کدی که من در ابتدا تو برنامه استفاده کردم همین کدی بود که شما نوشتید منتها من می خواستم از این کد استفاده نکنم چون در این صورت مجبورم از Dbrst1.Filter برای filter کردن استفاده کنم که در تعداد رکوردهای بالا خیلی زمانگیر . که دوستان برای رفع مشکل زمان استفاده از Command رو پیشنهاد دادن که بعد اون مشکلات پیش اومد . الان اگه بتونم CurserType رو تغییر بدم فکر کنم مشکل حل بشه .

kasmaii61
جمعه 03 فروردین 1386, 10:31 صبح
دوستان کسی دیگه نمیتونه به من کمک کنه؟
این خیلی برام حیاتیه
اگه راه دیگه ای هم برای بهبود سرعت دارین ممنون میشم بگین
همین راه Command خیلی سرعت رو بالا می برد منها این مشکل RecordCount رو نمی دونم چه جوری حل کنم