PDA

View Full Version : حرفه ای: دسترسی به پارامتر خارجی توسط TableAdapter



shahin60
پنج شنبه 14 شهریور 1392, 22:43 عصر
سلام
با استفاده از sp و TableAdapter چطوری به این پارامتر دسترسی پیدا کنم
کدsql:

ALTER PROCEDURE [dbo].Insert_User
(
@name nvarchar(50),
@user nvarchar(50),
@pass nvarchar(50),
@uper int,
@result int output
)
AS
if(exists(SELECT * FROM [User] WHERE [user] = @user))
set @result=1
else
begin
set @result=0
INSERT INTO [dbo].[User] ([name], [user], [pass], [uper]) VALUES (@name, @user, @pass, @uper)
end
return

کد برنامه:

int result ;
DataSet1TableAdapters.UserTableAdapter da = new DataSet1TableAdapters.UserTableAdapter();
DataSet1.UserDataTable dt = new DataSet1.UserDataTable();
da.Insert(txtName.Text, txtUser.Text, txtPass.Text, 1,result);


متن خطا:
can not convert ref int to int

مهرداد صفا
جمعه 15 شهریور 1392, 00:35 صبح
با سلام.
آرگومنت result در SP به صورت ref تعریف شده و شما باید پارامتری که به این متود ارسال می کنید از کلمه کلیدی ref استفاده کنید. به این صورت:


table.Insert(...,...,......,ref result);

shahin60
جمعه 15 شهریور 1392, 08:24 صبح
حالا این خطا رو میده
can not convert from ref int to ref int

مهرداد صفا
جمعه 15 شهریور 1392, 09:25 صبح
حالا این خطا رو میده
can not convert from ref int to ref int

احیانا یک "؟" بعد از "ref int" نیست؟
متغیر result را به این صورت تعریف کنید:


int? result;
//or
Nullable<int> result=new Nullable<int>();

shahin60
جمعه 15 شهریور 1392, 09:41 صبح
اقا درود به شما
فقط باید مقدار اولیه هم می دادم

int? result = 0 ;


میشه یه مقدار در مورد ref و این علامت سوال توضیح بدید؟

مهرداد صفا
جمعه 15 شهریور 1392, 10:51 صبح
اگر به پرسیجر Insert دقت کنید، مقدار پارامتر result نتیجه اجرای procedure را بر می گرداند پس این متغیر باید به گونه ای به متود ارسال شود که تغییراتی که داخل تابع روی آن اعمال می شود روی متغیر اصلی هم موثر باشد. نحوه ارسال با ارجاع و یا by ref چنین امکانی را ایجاد می کند. از طرفی چون این آرگومنت صرفا نتیجه تابع را بر میگرداند، نیاز به مقدار اولیه ندارد و باید امکان Null بودن را هم داشته باشد، ولی همانطور که می دانید مقدار null برای متغیرهای value type در .net معنی ندارد ولی در SqlServer اینطور نیست. در واقع یک int به عنوان مثال در .net نمیتواند بدون مقدار باشد و در نهایت مقدار 0 برای آن در نظر گرفته می شود در حالیکه در SqlServer می تواند مقدار 0 یا هر مقدار دیگر داشته باشد و یا مقداردهی نشده باشد و مقدار آن null باشد
به همین دلیل برای ایجاد امکان مقداری دهی value type ها با null (یا بهتره بگیم مقدار ندهی value type ها با null) از Nullable<t> یا t? ( t=value type) استفاده می شود.
برای اطلاعات بیشتر:
http://barnamenevis.org/showthread.php?398105-%D9%85%DB%8C%D8%B4%D9%87-%D8%AF%D9%84%DB%8C%D9%84-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D9%BE%D8%A7%D8%B1%D8%A7%D9%85%D8%AA%D8%B1%D9%87%D 8%A7%DB%8C-ref-%D9%88-out-%D8%B1%D9%88-%D8%AA%D9%88%D8%B6%DB%8C%D8%AD-%D8%A8%D8%AF%DB%8C%D8%AF%D8%9F

http://barnamenevis.org/showthread.php?412151-%D8%A7%D8%B1%D8%B3%D8%A7%D9%84-%DB%8C%DA%A9-%D8%B4%DB%8C-%D8%A7%D8%B2-%DA%A9%D9%84%D8%A7%D8%B3-%D8%A8%D9%87-%D8%B9%D9%86%D9%88%D8%A7%D9%86-%D8%A2%D8%B1%DA%AF%D9%88%D9%85%D8%A7%D9%86-%D9%85%D8%AA%D8%AF

http://barnamenevis.org/showthread.php?389756-Ref-%D8%AF%D8%B1-%D8%AA%D9%88%D8%A7%D8%A8%D8%B9&highlight=ref%3Bout%3B

http://barnamenevis.org/showthread.php?350729-%D8%AD%D8%A8%D8%AB-%DA%A9%D9%86%DB%8C%D9%85-%D8%B1%D8%A7%D8%AC%D8%B9-%D8%A8%D9%87-ref-%D9%88-out&highlight=ref%3Bout%3B

http://barnamenevis.org/archive/index.php/t-42369.html

http://barnamenevis.org/archive/index.php/t-314477.html

http://barnamenevis.org/archive/index.php/t-349884.html

http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx