View Full Version : سوال: مشکل در تعریف پارامتر ADoQuery در دلفی 2009
hadisalahi2
سه شنبه 28 مهر 1388, 17:20 عصر
با سلام به همگی دوستان.
امروز یک برنامه نوشتم که چند تا عمل جستجو را باید با دستور Select انجام بده.
مثل همیشه از Adoqury استفاده کردم . ولی به یک مشکل خیلی خیلی عجیب برخوردم!!!!!!!!
دستور زیر رو ملاحضه بفرمایید:
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:='select * from AxisTable where AxisId=:a';
ADOQuery1.Parameters.ParamByName('a').Value:=Edit1 .Text;
ADOQuery1.Active:=True;
در این دستورات یک پارامتر a تعریف کردم. ولی متاسفانه هنگامی که به خط
ADOQuery1.SQL.Text:='select * from AxisTable where AxisId=:a';
میرسه و هنگامی که این خط رو اجرا میکنم ، پیغام خطای زیر رو میده:
Exception class EOleException with message 'Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another'.
تا الان اصلا به همچین مشکلی برخورد نکرده بودم. هرجایی که به ذهنم رسیده رو تغییر دادم ولی مشکلم حل نشد.
نکته جالب تر اینکه وقتی اون خط رو بدون تعریف پارامتر و به صورت زیر تعریف میکنم مشکل حل میشه و Query اجرا میشه.
ADOQuery1.SQL.Text:='select * from AxisTable where AxisId='+edit1.text;
اگه دوستان راهنمایی کنند ممنون میشم.
vcldeveloper
سه شنبه 28 مهر 1388, 21:01 عصر
پارامترتان به چه شکلی تعریف شده؟
hadisalahi2
سه شنبه 28 مهر 1388, 21:10 عصر
پارامتر رو با دستور زیر مشخص میکنم. منظورتون چیزی به غیر از اینه؟
AdoQuery1.Parameters.paraByname('a').value:=Edit1. text;
vcldeveloper
سه شنبه 28 مهر 1388, 21:22 عصر
خصوصیات پارامتر، مثل نوع داده آن را هم براش مشخص کنید.
hadisalahi2
سه شنبه 28 مهر 1388, 21:43 عصر
نه براش مشخص نکردم.
ولی خوب فکر نکنم نیازی به این کار باشه.
من همیشه از همین روش استفاده میکنم و هیچ مشکلی هم نداشتم ولی نمیدم چرا الان این پیغام رو میده.
به نظر شما ممکنه خود دلفی مشکل دار شده باشه یا اینکه کامپوننتهای ADO دارای مشکل باشند؟
hadisalahi2
چهارشنبه 29 مهر 1388, 20:27 عصر
دوستان ما متظر نظرات و راهنمایی های شما هستیم
hadisalahi2
شنبه 02 آبان 1388, 10:40 صبح
مشکل من هنوز حل نشده؟
به نظر شما نحوه کار ADOQuery در دلفی 2009 با دلفی 2007 تفاوتی میکنه؟
M aJi D
شنبه 02 آبان 1388, 14:30 عصر
شذسلام.
دوست عزیز در AxisId چون شما 2 تا حرف بزرگ دارید
برای همین ایراد میگیره در دستورتون بجای AxisId:=a بنویسید AxisId]=:a]
فکر کنم درست شه.
موفق باشید
دلفــي
شنبه 02 آبان 1388, 15:04 عصر
من این کد شما رو با دیتابیس اکسس در دلفی 7 تست کردم ، هیچ خطایی نداد :
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:='select * from AxisTable where AxisId=:a';
ADOQuery1.Parameters.ParamByName('a').Value:=Edit1 .Text;
ADOQuery1.Active:=True;
hadisalahi2
شنبه 02 آبان 1388, 16:25 عصر
بانک اطلاعاتی من SQL Server 2000 است . ولی فکر نکنم مشکل از بانک اطلاعاتی باشه.
من هم قبلا گفتم ، قبلا با هم دستورات بدون هیچ مشکلی عمل جستجو را انجام می دادم ولی الان نمیدونم که چرا پیغام خطا میده.
hadisalahi2
دوشنبه 04 آبان 1388, 08:57 صبح
با سلام
مشکل در کل مربوط به دلفی 2009 بود!!!!!!!!!!!!!!!!!!!!!!!!!!!!
همین فرم و همین دستورات رو در دلفی 2007 اجرا کردم و بدون هیچ خطایی کامپایل شد و برنامه اجرا شد.
واقعا برام جای تعجبه که چرا در دلفی 2009 همچین مشکلی وجود داره.
به نظر دوستان و اساتید ، مشکل از کجا میتونه باشه؟
اگه مشکل حل نشه ، من مجبورم با دلفی 2007 کار کردم و از فیض حضور دلفی 2009 محروم می شوم.
jda1705
جمعه 29 آبان 1388, 19:04 عصر
با سلام
نوع فیلد AxisId متغیری عددی می باشد. این در حالی است که شما از مقدار Edit1.Text که مقداری رشته ای می باشد استفاده نموده اید
برای همین که پیغام خطای Wrong Type را مشاهده می کنید.
برای حل مشکل از به جای Edit1.Text از StrToInt(edit1.text) استفاده نمائید.
alinikaein
شنبه 30 آبان 1388, 08:51 صبح
سلام دوست عزيز؛
يك كاري كن ببين درست ميشه يا نه؛ خط زير را قبل از مقدار دهي به پارامتر، اضافه كن، انشاءالله كه درست ميشه:
Adoquery1.Parameter.Refresh;
يا علي... موفق باشي...
Hadi_Fayyaz
شنبه 30 آبان 1388, 12:26 عصر
سلام دوستان
من فكر ميكنم Type مربوط به فيلد AxisId يه چيزي غير از String باشه در اين صورت وقتي شما يك مقدار Text رو به اون نسبت ميديد قطعا ايراد ميگيره
اما چرا وقتي دستور رو به شكل زير مينويسيد خطا نميده
ADOQuery1.SQL.Text:='select * from AxisTable where AxisId='+edit1.text;
به خاطر اينه كه دلفي در زمان اجرا محتواي Edit1.Text رو كه هرچي هست برميداره و در دستور SQL جا ميده مثلا فرض كنيد مقدار داخل EDit1.text برابر 5 باشه اونوقت دستور بالا توسط دلفي در زمان اجرا به شكل زير درمياد
'select * from AxisTable where AxisId=5
كه از نظر اجرا هيچ مشكلي نداره.
اما با اين فرض كه فيلد AxisId از نوع Int باشه و شما دستور زير رو نوشته باشيد
ADOQuery1.SQL.Text:='select * from AxisTable where AxisId=:a'; تا اينجاي كار هم اشكالي به وجود نمياد ولي وقتي دلفي ميخواد دستور بعدي رو تفسير و اجرا كنه يعني دستور زير
ADOQuery1.Parameters.ParamByName('a').Value:=Edit1 .Text;
اونوقته كه اشكال به وجود مياد چون Value مربوط به پارامترتون از نوع Int هست ولي داريد يك مقدار String رو بهش نسبت ميديد.
البته من با فرض اينكه Type فيلد AxisId چيزي غير از String باشه مطالب رو گفتم در غير اين صورت دستوري كه شما نوشتيد كاملا درسته و كار هم ميكنه.
موفق باشيد
x_epro_x
چهارشنبه 18 آبان 1390, 17:52 عصر
سلام
من تو دلفی 7 امتحان کردم جواب داد !!!!!
فقط یه مشکل دیگه دارم اونم این که :
پارامترا فقط تو دستور select کاربرد دارن یا نه تو بقیه دستورات sql هم میشه پارامتر فرستاد ؟:متفکر:
insert
update
delete
سعید صابری
چهارشنبه 18 آبان 1390, 18:10 عصر
فرقی نمیکنه
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.