View Full Version : در یک function نمشه update انجام داد؟
moeeniyan
دوشنبه 26 اردیبهشت 1390, 12:06 عصر
من در یک functio نیاز به update یک جدول دارم ولی این error رو میگیرم
Invalid use of a side-effecting operator 'UPDATE' within a function
در ضمن function من این هست:
create
function ChangePass(@UserName nvarchar(50), @OldPass nvarchar(50), @NewPass nvarchar(50))
returns
int
as
begin
declare @Conclusion int= 0
update Users set Pass=@NewPass where UserID in(select UserID from Users where UserName=@UserName and Pass=@OldPass)and UserName=@UserName
if@@ROWCOUNT= 0
set @Conclusion = 0
else
set @Conclusion = 1
return @Conclusion
end
یوسف زالی
دوشنبه 26 اردیبهشت 1390, 16:49 عصر
نمی شه.
جاش از StoredProcedure استفاده کن.
توش میتونی یه Integer هم Return کنی.
moeeniyan
دوشنبه 26 اردیبهشت 1390, 16:57 عصر
نمی شه.
جاش از StoredProcedure استفاده کن.
توش میتونی یه Integer هم Return کنی.
تا اونجایی که من میدونم store procedure چیزی رو return نمیکنه!:متفکر:
یوسف زالی
سه شنبه 27 اردیبهشت 1390, 04:02 صبح
امتحان کن عزیز.
از هر Procedure می تونی جز کارایی که انجام میده یه Return از نوع عددی داشته باشی.
مثلا:
create procedure P1
@a int,
@b int
as
select'Test'
return @a + @b
و در استفاده :
declare @result int
exec @result = P1 10, 20
select @result
حمیدرضاصادقیان
سه شنبه 27 اردیبهشت 1390, 07:34 صبح
تا اونجایی که من میدونم store procedure چیزی رو return نمیکنه!:متفکر:
سلام.
به جز استفاده از Return شما میتوانید با تعریف فیلد از نوع Output ، خروجی هم داشته باشید.که میتونه حتی چند تا فیلد از نوع Output داشته باشید.
یوسف زالی
چهارشنبه 28 اردیبهشت 1390, 19:32 عصر
اینم مثال ها:
70070
moeeniyan
دوشنبه 02 خرداد 1390, 12:51 عصر
من هنوز نتونستم مشکلم رو حل کنم وباز هم به مشکل برخورد کردم:گریه:
با راهنمایی های شما من یک پروسجر نوشتم به این صورت
ALTERprocedure [dbo].[ChangePass](@UserName nvarchar(50), @OldPass nvarchar(50), @NewPass nvarchar(50))
as
begin
declare @Conclusion int= 0
update Users set Pass=@NewPass where UserID in(select UserID from Users where UserName=@UserName and Pass=@OldPass)
and UserName=@UserName
if@@ROWCOUNT=0
set @Conclusion =0 --hich kodam update nashode
else
set @Conclusion=1 --1 mored update shode
return @Conclusion
end
حالا نمیدونم چطوری توی کدنویسی ازش استفاده کنم
فقط میدونم که به شکل زیر نمیشه
Cmd.CommandType = CommandType.StoredProcedure;
Cmd.CommandText = "select dbo.ChangePass";
یوسف زالی
دوشنبه 02 خرداد 1390, 12:58 عصر
توی دلفی یه پارامتر به نام @return_value داره.
ببین توی C# هم احتمالا داشته باشه.
بعد از exec کردن خودش مقدار می گیره.
behrouzlo
دوشنبه 02 خرداد 1390, 14:27 عصر
Cmd.CommandText = "select dbo.ChangePass"
توی خط بالا کلمه select را حذف کنید همین.
Cmd.CommandText = "ChangePass"
moeeniyan
دوشنبه 02 خرداد 1390, 19:37 عصر
Cmd.CommandText = "select dbo.ChangePass"
توی خط بالا کلمه select را حذف کنید همین.
Cmd.CommandText = "ChangePass"
خوب اگه این کار رو انجام بدم چطوری از نتیجه استفاده کنم ؟ چطوری بفهمم که آیا ردیفی آپدیت شده یا نه ؟ من به نتیجه @conclusion احتیاج دارم
حمیدرضاصادقیان
سه شنبه 03 خرداد 1390, 08:28 صبح
سلام.
شما وقتی کوئری خود را با ExecuteNonQuery اجرا کنید. نتیجه ای که برمیگردانه تعداد ردیفهای Update شده هست.
پس کد شما باید به این شکل تغییرکنه.
ALTER procedure [dbo].[ChangePass](@UserName nvarchar(50), @OldPass nvarchar(50), @NewPass nvarchar(50))
as
begin
update Users set Pass=@NewPass where UserID in(select UserID from Users where UserName=@UserName and Pass=@OldPass)
and UserName=@UserName
end
و کد سی شارپ شما به این شکل میشه.
Cmd.CommandType = CommandType.StoredProcedure;
Cmd.CommandText = "dbo.ChangePass";
int i =Cmd.ExecuteNonQuery();
Label1.text = i.ToString();
در این کد دستور شما اجرا شده و تعداد رکوردهای بازگشتی نیز توسط ExecuteNonQuery به متغیر i ریخته می شود.
من در قسمت آخر مقدار اونو در یک Label قرار دادم که میتونید به جای اون کار مورد نظرتون رو باهاش انجام بدید.
behrouzlo
سه شنبه 03 خرداد 1390, 10:57 صبح
اگر خواستید می توانید به صورتی که آقای صادقیان در بالا اشاره کردند کارتان را انجام دهید. و اگر خواستید مقدار @Conclusion را بازیابی کنید می توانید به شکل زیر عمل کنید.
int i =Cmd.ExecuteScalar ();
Label1.text = i.ToString();
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.