PDA

View Full Version : سطح دسترسی>جلوگیری از ثبت کاربری تکراری>استفاده از یک SP و تابع EXISTS



dr_ghezavat
یک شنبه 25 مرداد 1388, 02:31 صبح
سلام در تالار سی شارپ سوألی مطرح کردم با این مضمون :


سلام و خسته نباشید خدمت دوستان و اساتید محترم . در مورد تعیین سطح دسترسی منابع زیادی در سایت هست ولی جزئیاتی مثل این مورد که چطور از ورود نام کاربری تکراری جلوگیری کنیم رو من نتونستم پیدا کنم .
در یه دیتابیس نام کاربری و کلمه عبور ها ذخیره میشه . در دکمه ی ثبت نام همراه کدهای اضافه کردن کاربر جدید چه شرطی باید بدم که در صورت موجود بودن نام کاربری به ما پیغام "نام کاربری وارد شده قبلا ثبت شده" نشون بده ؟

دوستی گفت :
اگر از بانک اطلاعاتی SQL Server استفاده می کنید من به شما پیشنهاد می کنم که با استفاده از یک SP و تابع EXISTS این کار را انجام دهید.

میشه راهنمایی کنید که از stored Procedure ها چطور میتونم استفاده کنم و با استفاده از تابع اکزیست چطور؟ نمونه ی کدی اگه باشه ممنان میشوم . :لبخندساده:

محمد سلیم آبادی
یک شنبه 25 مرداد 1388, 06: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, 18:33 عصر
exsis را در سي شارپ چه جوري بكار بگيريم

Reza.ariyan
دوشنبه 25 آبان 1388, 18: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, 19: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, 19:19 عصر
exsis را در سي شارپ چه جوري بكار بگيريم

Exists یک عملگر اولیه در زبان استاندارد SQL است. مثل عملگر مجموعه ای Union.
بهتره یک Stored Procedure بنویسید که داخل آن وجود یا عدم وجود مقدار تکراری با این عملگر چک بشه اگر تکراری نبود داده ها در جدول درج و در غیر اینصورت یک exception تولید بشه (با کمک Raiserror)

saeedr22
دوشنبه 25 آبان 1388, 19:52 عصر
این کا رو می تونین در خود C#‎ پیاده سازی کنیید.مثلاً اگر از acceess استفاده می کنید.
باید ابتدا یه select انجام بدی و بعد اونو درون یک datatable بریزین و با
if(dt.rows.count==0) چک کنید
و بعد insert کنید.

Reza.ariyan
دوشنبه 25 آبان 1388, 20:00 عصر
این کا رو می تونین در خود C#‎‎‎‎ پیاده سازی کنیید.مثلاً اگر از acceess استفاده می کنید.
باید ابتدا یه select انجام بدی و بعد اونو درون یک datatable بریزین و با
if(dt.rows.count==0) چک کنید
و بعد insert کنید.
100%
روش اول نرمال تر هست
ولی تو این روش باید اول یه Select گرفته بشه و یه شرط چک بشه و بعد داده ها وارد بشه (یعنی ترافیک بین سایت و بانک دو برابر روش قبلی میشه که برای سایت هایی که Database Server اوون ها از Web Server جداست و ترافیک بالایی دارن جالب نیست)
ولی برای کارای معمولی خوبه

saeedr22
چهارشنبه 27 آبان 1388, 16:27 عصر
100%
روش اول نرمال تر هست
ولی تو این روش باید اول یه Select گرفته بشه و یه شرط چک بشه و بعد داده ها وارد بشه (یعنی ترافیک بین سایت و بانک دو برابر روش قبلی میشه که برای سایت هایی که Database Server اوون ها از Web Server جداست و ترافیک بالایی دارن جالب نیست)
ولی برای کارای معمولی خوبه

100% روش اول بهینه تر و بهتر هستش و تا زمانی که در خود sqlserver نوشته نشه بهینه تر نیست و تقریباً هم تو access نمیشه ازش استفاده کرد.
من این روش رو گفتم تا زمانی که نمیشه از روش اول استفاده کرد از این روش استفاده بشه.

Reza.ariyan
چهارشنبه 27 آبان 1388, 16:48 عصر
100%
این کا رو می تونین در خود C#‎‎‎ پیاده سازی کنیید.مثلاً اگر از acceess استفاده می کنید.
باید ابتدا یه select انجام بدی و بعد اونو درون یک datatable بریزین و با
if(dt.rows.count==0) چک کنید
و بعد insert کنید.
اولا : من اینو گفتم 100% ، یعنی 100 درصد میشه اینکارو کرد


100% روش اول بهینه تر و بهتر هستش و تا زمانی که در خود sqlserver نوشته نشه بهینه تر نیست و تقریباً هم تو access نمیشه ازش استفاده کرد.
من این روش رو گفتم تا زمانی که نمیشه از روش اول استفاده کرد از این روش استفاده بشه.
دوما : اینجا غرفه MSSQLSERVER هست نه Access (فروم ;) )

سوما : :افسرده: ،،، هیچی ...

saeedr22
چهارشنبه 27 آبان 1388, 18:06 عصر
اولا : من اینو گفتم 100% ، یعنی 100 درصد میشه اینکارو کرد


دوما : اینجا غرفه MSSQLSERVER هست نه Access (فروم ;) )

سوما : :افسرده: ،،، هیچی ...

فرمایشات شما درست هستش.من معذرت میخوام.