PDA

View Full Version : سوال: مشکل پارامترهای AdoStoredProc



mosafer_deltang
جمعه 07 بهمن 1390, 03:53 صبح
سلام

وقتی یک ADOStoredProc روی فرم قرار میدهم و خصوصیت ProcedureName آن را مقدار دهی می کنم با این که وقتی در قسمت Parameters همه ی پارامترها را می بینم ولی با اجرای برنامه و اجرای کد زیر مقدار پارامترهای آن را صفر نشان می دهد و هیچ کدام از آن ها را نمی شناسد
مشکل چیست؟ خیلی سرچ کردم هیچی پیدا نکردم


ShowMessage(IntToStr(DM.ADOStoredProc1.Parameters. Count));


همچنین وقتی به کد زیر میرسه پیغام میده که پارامتری وجود نداره


DM.ADOStoredProc1.Parameters.ParamByName('@Name'). Value := 'dddd';


ADOStoredProc1: parameter '@Name' not found

tiphooo
جمعه 07 بهمن 1390, 04:12 صبح
کانکشن شما باید به دیتابیس مقصد متصل باشد و پس از انتخاب نام پروسیجر خاصیت Parameters آن را کلیک کرده و با انتخاب همه پارامترها مقدار آن را Null قرار دهید مشکلتان حل می شود . البته قبل از هر چیز مطمئن شوید دیتابیسی که در آن پروسیجر را اصلاح و یا ایجاد کرده اید با دیتابیسی که در برنامه به آن وصل می شوید یکی باشد.

mosafer_deltang
جمعه 07 بهمن 1390, 18:28 عصر
همه این کارها رو کردم ولی باز هم درست نشد
لطفا کمک کنید...

یوسف زالی
جمعه 07 بهمن 1390, 20:10 عصر
نمونه برنامتون رو بگذارید.

mosafer_deltang
جمعه 07 بهمن 1390, 20:30 عصر
ADOStoredProc1.Prepared := True;
ADOStoredProc1.ProcedureName := 'Proc_Insert_Return_Factor';
ShowMessage(IntToStr(ADOStoredProc2.Parameters.Cou nt));

ADOStoredProc1.Parameters.ParamByName('@Name').Val ue := 'jjj';
ADOStoredProc1.Parameters.ParamByName('@Tell').Val ue := 'jjj';
ADOStoredProc1.Parameters.ParamByName('@Car').Valu e := 'برگشت فاکتور ';
ADOStoredProc1.Parameters.ParamByName('@Status').V alue := 'منتظر فاكتور';
ADOStoredProc1.Parameters.ParamByName('@Base').Val ue := 0;
ADOStoredProc1.Parameters.ParamByName('@Cost').Val ue := -10;
ADOStoredProc1.Parameters.ParamByName('@Discount') .Value := 0;
ADOStoredProc1.Parameters.ParamByName('@Pocket').V alue := 5;
ADOStoredProc1.Parameters.ParamByName('@Card').Val ue := 0;
ADOStoredProc1.Parameters.ParamByName('@Work_Type' ).Value := 'jjj';
ADOStoredProc1.ExecProc;




alter PROCEDURE [dbo].[Proc_Insert_Return_Factor]
@Name nvarchar(100),
@Tell nvarchar(20),
@Car nvarchar(50),
@Status nvarchar(50),
@Base money,
@Cost money,
@Discount money,
@Pocket money,
@Card money,
@Work_Type nvarchar(10)
AS
BEGIN
insert into Reception
(Name, Tell, Car, Status, Base, Cost, Discount, Pocket, Card, Work_Type)
values
(@Name, @Tell, @Car, @Status, @Base, @Cost, @Discount, @Pocket, @Card, @Work_Type)
END

یوسف زالی
جمعه 07 بهمن 1390, 20:50 عصر
منظورم خود برنامه بود نه کدهاش.
کانکشنتون درسته دیگه؟

AliReza Vafakhah
جمعه 07 بهمن 1390, 21:32 عصر
من هیچ وقت از Param و SotoredProc ها استفاده نمی کنم. مستقیم دستور SQL می نویسیم و اجراش میکنم سپس نتیجه رو برسی می کنم.

mosafer_deltang
جمعه 07 بهمن 1390, 21:37 عصر
آره کانکشن درسته

tiphooo
شنبه 08 بهمن 1390, 01:10 صبح
چون شما اسم پروسیجر را از طریق کد نویسی وارد می کنید قبل از مقدار دهی پارامترها از کد زیر استفاده کنید.
ADOStoredProc1.Parameters.Refresh;
بک نکته دیگه اینکه دوست عزیز چرا شما با دستور With قهر هستی؟ برای راحتی کار و جلوگیری از تکرار به صورت زیر بنویس
with ADOStoredProc1 do
begin
;Prepared:=True
;ProcedureName := 'Proc_Insert_Return_Factor'
;close
;Parameters.Refresh
;.Parameters.ParamByName('@Name').Val ue := 'jjj'
.
.
.
;open
;end
در ضمن در پیغام نمایشی Showmessage از پارامترهای ADOStoredProc2 استفاده کردی و در بقیه موارد از ADOStoredProc1
من فایل ارسالی شما را ندیدم ولی اگه با این کار مشکل حل نشد بگید که فایلتون را بررسی کنم

mosafer_deltang
یک شنبه 09 بهمن 1390, 00:36 صبح
خیلی خیلی ممنون از طریق کد با refresh حل شد
ولی با تنظیم پارامترها از تو برنامه بازم خطا میده اگه لطف کنید مشکل اونم بگید

به خاطر with هم ممنون چشم

tiphooo
یک شنبه 09 بهمن 1390, 03:59 صبح
شما فیلد ID که از نوع int تعریف کردید قاعدتا Identity نیست و اجازه Null بودن هم ندارد و در پروسیجرتان هم مقدار ان را درج نکرده اید پس یا ID را Identity کنید یا تیک AllowNull آن را بزنید و یا اینکه یک پارامتر هم برای آن تعریف کنید و مقدار آن را از طریق برنامه ارسال کنید اشکالی در برنامه وجود ندارد فقط اشکال در مقدار دهی فیلدهای جدولتان است و اینکه شما در هر دو مرحله دارید پارامترهای ADOStoredProc1 را مقدار دهی می کنید شاید اشتباه تایپی دارید پس از اصلاح اشتباه تایپیتان لطفا بر روی خاصیت Parameters کلیک کرده و خاصیت Value همه آنها را Null کنید مشکلتان حل می شود.البته باید Null را با پرانتز بنویسید به صورت (Null)

mosafer_deltang
یک شنبه 09 بهمن 1390, 15:08 عصر
ولی فیلد ID تعریف شده Identity هست.
همه پارامترها را (Null) گذاشتم بازم درست نشد.
یه نکته خیلی عجیب این که بعضی وقت ها با دستکاری همین پارامترها وقتی برنامه را اجرا می کنم debugger ویژال استادیو باز میشه و این پیامو میده:

An Unhandled Win32 exception occurred

عجیب تر اینکه برای رفع این خطا مجبورم از تو برنامه مقدار خاصیت ProcedureName رو Cut کنم و بعد دوباره Paste کنم تا این خطا رفع بشه

اگه زحمتی نیست شما خودتون برنامه رو با جدول و پروسیجری که گذاشتم اجرا کنید. میخوام ببینم فقط من این مشکلو دارم یا نه؟ ممنون

tiphooo
یک شنبه 09 بهمن 1390, 20:53 عصر
81678
این همون برنامه خودته که مشکلی هم نداره فقط Connection رو یک بار دیگه پر کن و یک سوال مگه دیتابیست SQLServer نیست؟ اگه هست چرا ConnectionString رو اینجوری پر کردی؟ .