ورود

View Full Version : سوال: یک مشکل با ADO - لطفا کمک



amir_ir
چهارشنبه 23 اردیبهشت 1388, 12:49 عصر
سلام به همه دوستان
یک database دارم که به با paradox ایجاد شده. و دارای 2 عدد فیلد name و family هست که هر دو از جنس String هستند و از ADO استفاده کردم. در onchange یک editbox کد زیر نوشتم و خروجی در یک DBgrid نمایش داده می شود.


ADOT1.Active:=false;
ADOQ1.Active:=false;
ADOQ1.SQL.Clear;
ADOQ1.SQL.Add('select * from dr where name like :na');
ADOQ1.Parameters.ParamByName('na').Value:=txtname. Text;
ADOQ1.ExecSQL;
ADOT1.Active:=true;
ADOQ1.Active:=true;
DBGrid1.DataSource.DataSet:=ADOQ1;


تا برنامه رو run می کنم پیغام Invalid variant type conversion رو میده.
ولی اگر به این پیام توجه نکنم و دوباره دکمه run رو بزنم و ادامه بدم برنامه کار میکنه.
این error واسه چیه و به شکل میشه برطرفش کرد؟؟؟؟
ممنون می شوم اگر دوستان منو راهنمایی کنند.

مجتبی جوادی
چهارشنبه 23 اردیبهشت 1388, 14:25 عصر
قبل از قرار دادن مقدار یک شرط بگذار

if txtname.Text<>'' then
ADOQ1.Parameters.ParamByName('na').Value:=txtname. Text;

vcldeveloper
چهارشنبه 23 اردیبهشت 1388, 17:58 عصر
1- نیازی به استفاده از ExecSQL نیست.
2- ADOT1 چی هست که دائما آن را فعال و غیرفعال می کنید؟ اگر ربطی به این کوئری نداره، بیخودی آن را فعال/غیرفعال نکنید.
3- اگر هدف شما داشتن قابلیت جستجوی افزایشی هست، و حجم داده های موجود در جدول شما هم زیاد نیست، استفاده از Filter سربار کمتری نسبت به ارسال کوئری های متعدد داره.
4- اگر لازم هست که حتما از کوئری استفاده کنید، بجای آنکه دائما مقدار SQL آن را تغییر بدید، یک بار دستور SQL را بنویسید، و دفعات بعد، فقط به Parameter مقدار بدید.
5- برای افزایش کارایی، اولین بار کوئری را Prepare کنید. دقت کنید که هر بار این کار را انجام ندید! فقط یک بار کفایت میکنه، اگر هر بار انجام بدید، بجای افزایش کارایی، کاهش کارایی خواهید داشت.

amir_ir
چهارشنبه 23 اردیبهشت 1388, 23:36 عصر
سلام
آقای کشاورز و آقای جوادی واقعا ممنون .
آقای کشاورز میشه 2 مورد زیر رو فقط با نوشتن کد توضیح بدید. دقیقا متوجه 2 مورد زیر نشدم:
نقل قول:
4- اگر لازم هست که حتما از کوئری استفاده کنید، بجای آنکه دائما مقدار SQL آن را تغییر بدید، یک بار دستور SQL را بنویسید، و دفعات بعد، فقط به Parameter مقدار بدید.
5- برای افزایش کارایی، اولین بار کوئری را Prepare کنید. دقت کنید که هر بار این کار را انجام ندید! فقط یک بار کفایت میکنه، اگر هر بار انجام بدید، بجای افزایش کارایی، کاهش کارایی خواهید داشت.

امکان این هست که کدی رو که من نوشتم اصلاح بفرمائیدو
ممنون

amir_ir
چهارشنبه 23 اردیبهشت 1388, 23:59 عصر
سلام . ممنون از راهنماییهاتون
امکانش هست کد زیر رو با توجه به مورد های 4 و5 زیر که توضیح دادید اصلاح بفرمائید.
ممنون میشم
در ضمن گفته بودید که ado رو فعال و غیر فعال نکنم.این کار رو کردم ولی جستجویی اصلا صورت نمی گرفت.
همین طور که قبلا گفته بودم ابتدا که برنامه رو run می کنم بلافاصله پیغام invalid variant type conversin رو میده و بدون توجه به این خطا دوباره run رو بزنم کاملا کد زیر کار میکنه!!!



ADOT1.Active:=false;
ADOQ1.Active:=false;
ADOQ1.SQL.Clear;
ADOQ1.SQL.Add('select * from dr where name like :na');
ADOQ1.Parameters.Parambyname('na').value:=txtname. Text;
ADOQ1.ExecSQL;
ADOT1.Active:=true;
ADOQ1.Active:=true;
DBGrid1.DataSource.DataSet:=ADOQ1;

نقل قول:

4- اگر لازم هست که حتما از کوئری استفاده کنید، بجای آنکه دائما مقدار SQL آن را تغییر بدید، یک بار دستور SQL را بنویسید، و دفعات بعد، فقط به Parameter مقدار بدید.
5- برای افزایش کارایی، اولین بار کوئری را Prepare کنید. فقط یک بار کفایت میکنه، اگر هر بار انجام بدید، بجای افزایش کارایی، کاهش کارایی خواهید داشت

باز هم ممنون

vcldeveloper
پنج شنبه 24 اردیبهشت 1388, 00:40 صبح
به Prepared و SQL از طریق Object Inspector مقدار بدید. و سپس کد زیر را بجای کد قبلی بنویسید:


ADOQ1.Active:=false;
ADOQ1.Parameters.Parambyname('na').value:= txtname.Text;
ADOQ1.Active:=true;
DBGrid1.DataSource.DataSet:=ADOQ1;