PDA

View Full Version : سوال: استفاده از exists



ciscozagros
سه شنبه 27 تیر 1391, 12:20 عصر
اولاً از مدیر و اساتید محترم سایت می خوام که این حقیر رو ببخشند برا سوال تکراریم خدایی جوابی پیدا نکردم
سوال :
من میخوام با استفاده از دستور exists چک کنم که رکورد تکراری وارد دیتا بیس نشه تا حدودی با استورپروسیجر پیش رفتم اگه یه استور پروسیجر بسازم و از داخل برنامه مقدار رو بفرستم به متغیر داخل استورپروسیجر چطوری نتیجه برگشتی از استورپروسیجر رو چک کنم

veniz2008
سه شنبه 27 تیر 1391, 12:30 عصر
سلام،یه مثال کامل براتون میزارم تا متوجه بشید،برای کنترل مشخصات کاربر هنگام ورود به سیستم از کد زیر استفاده کردم:
کدهای stored procedure:

create proc check_user
@username nvarchar(50),
@password nvarchar(50),
@result int output
as
if(EXISTS(select * from users where UserName=@username and Password=@password))
set @result=1
else
set @result=0
go
درون محیط دات نت هم از کدهای زیر استفاده میکنی:( فقط قبلش یه متغیر با نام res و از نوع int بصورت سراسری تعریف کن):

SqlConnection con = new SqlConnection("Data Source =(local);Initial Catalog=Plants;Integrated Security=True");
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "check_user";
cmd.Connection = con;
SqlParameter username = new SqlParameter("@username", TextBox1.Text);
SqlParameter password = new SqlParameter("@password", TextBox2.Text);
SqlParameter result = new SqlParameter("@result", res);
result.Direction = ParameterDirection.Output;
cmd.Parameters.Add(username);
cmd.Parameters.Add(password);
cmd.Parameters.Add(result);
con.Open();
cmd.ExecuteReader();
con.Close();
res = int.Parse(result.Value.ToString());
if (res == 1)
{

Session["iduser"] = TextBox1.Text;
Response.Redirect("User.aspx");
}
else
Label3.Text = "چنین کاربری در سیستم ثبت نشده است";

veniz2008
سه شنبه 27 تیر 1391, 12:45 عصر
البته اینم بگم که نیازی نیست برای اینگونه کارها حتما از متغیر خروجی درون stored procedure استفاده کنی.میتونی خیلی راحت تر هم این کارها رو انجام بدی. اگه خواستی بگو تا واست توضیح بدم.

ciscozagros
چهارشنبه 28 تیر 1391, 07:00 صبح
من stored procedure رو نوشتم وقتی متغیر خروجی رو تعریف می کنم ارور must declre رو میده

ciscozagros
جمعه 13 مرداد 1391, 21:30 عصر
اگه توضیح بدی ممنون میشم قربان

ma.rad
جمعه 13 مرداد 1391, 21:39 عصر
کد: stored procedure
ALTER PROCEDURE dbo.StudentAdd

(
@P_Name nvarchar(50),
@P_Family nvarchar(50),
@P_Age int,
@P_Degree nvarchar(50),
@P_Address ntext,
@Result nvarchar(30) output
)
AS

declare @ID int
set @Id=0

select @Id=Id from student where name=@P_Name

if @Id=0
begin
insert into Student (name,family,age,degree,address) values (@P_Name,@P_Family,@P_Age,@P_Degree,@P_Address)
set @result='افزودن با موفقیت انجام شده'
end
else
set @result='نام وارد شده تکراری است'


RETURN

nilmil_nil
جمعه 13 مرداد 1391, 21:48 عصر
این یه مثال از تریگر هست

ALTER TRIGGER [dbo].[BankDuplicateCheck]
ON [dbo].[Banks]
after INSERT, UPDATE/*, DELETE */
AS
if(select count(*) from Banks,inserted where banks.Bank_AccountNo=inserted.Bank_AccountNo) <>1
rollback transaction

این تریگر رو با توجه به اسم بانک و اسم فیلدی که میخوای مقدار تکراری نگیره تغییر بده
و روی جدولت اجراش کن
حالا چک کن کد خطایی که وقتی مقدار تکراری وارد میشه چیه که من برات مثال زدم

if (exp.Number == 3609)// for duplicate
{
MessageBox.Show("این نام قبلا ثبت شده است\n عملیات لغو شد ", "خطا تکراری", MessageBoxButtons.OK, MessageBoxIcon.Error);
}


exp.Number : همون Exeption هست که توی Try catch استفاده میشه
از اکسپشن SqlException برای به دام انداختن خطا های SQL استفاده میشه

ali_habibi1384
جمعه 13 مرداد 1391, 21:53 عصر
کد: stored procedure
ALTER PROCEDURE dbo.StudentAdd

(
@P_Name nvarchar(50),
@P_Family nvarchar(50),
@P_Age int,
@P_Degree nvarchar(50),
@P_Address ntext,
@Result nvarchar(30) output
)
AS

declare @ID int
set @Id=0

select @Id=Id from student where name=@P_Name

if @Id=0
begin
insert into Student (name,family,age,degree,address) values (@P_Name,@P_Family,@P_Age,@P_Degree,@P_Address)
set @result='افزودن با موفقیت انجام شده'
end
else
set @result='نام وارد شده تکراری است'


RETURN

در اين موارد بايد از trigger استفاده كني SP كه شما نوشتي فقط كار Add كردن رو انجام ميده حالا يه trigger مينويسي از نوع Instead Of كه داده ها رو قبل از ارسال چك ميكنه.