View Full Version : سطح دسترسی>جلوگیری از ثبت کاربری تکراری>استفاده از یک SP و تابع EXISTS
  
dr_ghezavat
یک شنبه 25 مرداد 1388, 03:31 صبح
سلام در تالار سی شارپ سوألی مطرح کردم با این مضمون :
سلام و خسته نباشید خدمت دوستان و اساتید محترم . در مورد تعیین سطح دسترسی منابع زیادی در سایت هست ولی جزئیاتی مثل این مورد که چطور از ورود نام کاربری تکراری جلوگیری کنیم رو من نتونستم پیدا کنم . 
 در یه دیتابیس نام کاربری و کلمه عبور ها ذخیره میشه . در دکمه ی ثبت نام همراه کدهای اضافه کردن کاربر جدید چه شرطی باید بدم که در صورت موجود بودن نام کاربری به ما پیغام "نام کاربری وارد شده قبلا ثبت شده" نشون بده ؟
دوستی گفت :  
اگر از بانک اطلاعاتی SQL Server استفاده می کنید من به شما پیشنهاد می کنم که با استفاده از یک SP و تابع EXISTS این کار را انجام دهید.
میشه راهنمایی کنید که از stored Procedure ها چطور میتونم استفاده کنم و با استفاده از تابع اکزیست چطور؟ نمونه ی کدی اگه باشه ممنان میشوم . :لبخندساده:
محمد سلیم آبادی
یک شنبه 25 مرداد 1388, 07:46 صبح
CREATE PROC SP_I_Users
@UserName char(50),
@Password char(50)
AS
BEGIN
IF  NOT EXISTS( SELECT * FROM Users WHERE UserName= @UserName)
INSERT  Users
VALUES (@UserName, @Pasword)
RETURN 0
END
 
و اینگونه اجرا می شود.
EXEC SP_I_Users @UserName='User 1', @password='Pass 1'; درج می شود.
EXEC SP_I_Users @UserName='User 1', @password='Pass 1'; دیگر درج نخواهد شد.
csharpprogramer88
دوشنبه 25 آبان 1388, 19:33 عصر
exsis  را در سي شارپ چه جوري بكار بگيريم
Reza.ariyan
دوشنبه 25 آبان 1388, 19:48 عصر
تو SQL یه SP برای Inert درست کن
CREATE PROCEDURE [dbo].[sp_Users_Insert]
    @Username NVARCHAR(50),
    @Password NVARCHAR(50)
AS 
    BEGIN
        IF ( SELECT COUNT(*)
             FROM   dbo.Users
             WHERE  dbo.Users.Username = @Username
           ) > 0 
            BEGIN
                RETURN -1
            END
        ELSE 
            BEGIN
                INSERT  INTO Users
                        (
                          [Username],
                          [Password]
                        )
                VALUES  ( @Username, @Password )
                DECLARE @ReferenceID INT
                SELECT  @ReferenceID = @@IDENTITY
                RETURN @ReferenceID
            END
    END
حالا تو C# این SP رو Call کن و مقدار خروجی این SP رو تو یه متغییر بریز
با یه شرط If چک کن که اگر مقدار خروجی بزرگتر از 0 بود یعنی Insert شده و پیغام موفقیت آمیز بودن رو به کاربر نشون بده
در غیر این صورت پیغام بده که این نام کاربری از قبل وجود دارد
Reza.ariyan
دوشنبه 25 آبان 1388, 20:15 عصر
string connect = xxxxxxxxxxxxxxxxxxx;
SqlConnection scn = new SqlConnection(connect);
string sp = "sp_Users_Insert";
 SqlCommand spcmd = new SqlCommand(sp, scn);
spcmd.CommandType = CommandType.StoredProcedure
//SP Parameters
SqlParameter Username = new SqlParameter("@Username", SqlDbType.Nvarchar);
Username= this.txtUsername.Text;
SqlParameter Password = new SqlParameter("@Password", SqlDbType.Nvarchar);
Password= this.txtPassword.Text;
SqlDataReader dr;
spcmd.Parameters.Add(Username);
spcmd.Parameters.Add(Password);
scn.Open();
dr = spcmd.ExecuteReader()
 
int Result=dr.GetValue(0)
//Result
 بررسی کن که اگه Result بزرگتر از 0 بود یعنی Insert شده و اگه نبود نشده
راستی به جای xxxxxxxxxxxxxxxxxxx هم کانکشن استرینگ میخواد
محمد سلیم آبادی
دوشنبه 25 آبان 1388, 20:19 عصر
exsis را در سي شارپ چه جوري بكار بگيريم
 
Exists یک عملگر اولیه در زبان استاندارد SQL است. مثل عملگر مجموعه ای Union. 
بهتره یک Stored Procedure بنویسید که داخل آن وجود یا عدم وجود مقدار تکراری با این عملگر چک بشه اگر تکراری نبود داده ها در جدول درج و در غیر اینصورت یک exception تولید بشه (با کمک Raiserror)
saeedr22
دوشنبه 25 آبان 1388, 20:52 عصر
این کا رو می تونین در خود C#  پیاده سازی کنیید.مثلاً اگر از acceess استفاده می کنید.
باید ابتدا یه select  انجام بدی و بعد اونو درون یک datatable بریزین و با
if(dt.rows.count==0) چک کنید
و بعد insert  کنید.
Reza.ariyan
دوشنبه 25 آبان 1388, 21:00 عصر
این کا رو می تونین در خود C#  پیاده سازی کنیید.مثلاً اگر از acceess استفاده می کنید.
باید ابتدا یه select  انجام بدی و بعد اونو درون یک datatable بریزین و با
if(dt.rows.count==0) چک کنید
و بعد insert  کنید.
100%
روش اول نرمال تر هست
ولی تو این روش باید اول یه Select گرفته بشه و یه شرط چک بشه و بعد داده ها وارد بشه (یعنی ترافیک بین سایت و بانک دو برابر روش قبلی میشه که برای سایت هایی که Database Server اوون ها از Web Server جداست و ترافیک بالایی دارن جالب نیست)
ولی برای کارای معمولی خوبه
saeedr22
چهارشنبه 27 آبان 1388, 17:27 عصر
100%
روش اول نرمال تر هست
ولی تو این روش باید اول یه Select گرفته بشه و یه شرط چک بشه و بعد داده ها وارد بشه (یعنی ترافیک بین سایت و بانک دو برابر روش قبلی میشه که برای سایت هایی که Database Server اوون ها از Web Server جداست و ترافیک بالایی دارن جالب نیست)
ولی برای کارای معمولی خوبه
100% روش اول بهینه تر و بهتر هستش و تا زمانی که در خود sqlserver  نوشته نشه بهینه تر نیست و تقریباً هم تو access  نمیشه ازش استفاده کرد.
من این روش رو گفتم تا زمانی که نمیشه از روش اول استفاده کرد از این روش استفاده بشه.
Reza.ariyan
چهارشنبه 27 آبان 1388, 17:48 عصر
100%
این کا رو می تونین در خود C#  پیاده سازی کنیید.مثلاً اگر از acceess استفاده می کنید.
باید ابتدا یه select  انجام بدی و بعد اونو درون یک datatable بریزین و با
if(dt.rows.count==0) چک کنید
و بعد insert  کنید.         
اولا : من اینو گفتم 100% ، یعنی 100 درصد میشه اینکارو کرد
100% روش اول بهینه تر و بهتر هستش و تا زمانی که در خود sqlserver  نوشته نشه بهینه تر نیست و تقریباً هم تو access  نمیشه ازش استفاده کرد.
من این روش رو گفتم تا زمانی که نمیشه از روش اول استفاده کرد از این روش استفاده بشه.
دوما : اینجا غرفه MSSQLSERVER هست نه Access (فروم ;) )
سوما : :افسرده: ،،، هیچی ...
saeedr22
چهارشنبه 27 آبان 1388, 19:06 عصر
اولا : من اینو گفتم 100% ، یعنی 100 درصد میشه اینکارو کرد
دوما : اینجا غرفه MSSQLSERVER هست نه Access (فروم ;) )
سوما : :افسرده: ،،، هیچی ...
فرمایشات شما درست هستش.من معذرت میخوام.
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.