PDA

View Full Version : سوال: کمک - ثبت "نام کاربری" و "پسورد" در پروژها



sattar1
چهارشنبه 25 مرداد 1391, 12:46 عصر
سلامی گرم و آتشین به تمام مدیران و کاربران سایت برنامه نویس

بنده پروژه ای را به زبان C#‎‎‎ با پایگاه داده ی Sql در حال نوشتن هستم. (Sql مربوط به خود Visual Studio)
در همان قدم های اول به مشکلی بر خوردم که با کنجکاوی های زیاد به نتیجه ای نرسیدم
و از شما عزیزان درخواست کمک دارم.

ثبت "نام کاربری" و "پسورد" :
فرض کنید که میخواهیم "نام کاربری" و "پسوردی" را به ثبت برسانیم که در آن "نام کاربری" کلید اصلی است.
من میخواهم وقتی که "نام کاربری" را وارد کردم، پس از زدن دکمه ی ثبت در صورتی
که این نام تکراری است و در پایگاه وجود دارد، پیغام "این نام کاربری قبلا انتخاب شده" نمایش داده شود.

مشکل به وجود آمده بدین شرح است که :
پس از هر بار اجرای برنامه
وقتی که ابتدا یک "نام کاربری" غیر تکراری ثبت میشود، برنامه به درستی کار میکند (ثبت میشود)

و از این لحظه به بعد با وارد کردن "نام کاربری" تکراری پیغامی که می خواهم نمایش داده میشود:
"این نام کاربری قبلا انتخاب شده"

اما

وقتی که برای اولین بار پس از اجرای برنامه یک "نام کاربری" تکراری ثبت میشود این پیغام ظاهر میشود:

http://up.vatandownload.com/images/s96c32fzvbbtw6z4gbhw.jpg

*یعنی برنامه در صورتی درست عمل میکند که ابتدا حتما یک "نام کاربری" غیر تکراری ثبت شود .*

مشکل این برنامه چیه؟؟؟؟

خواهشا اگه کسی بلده کد درستشو بگه.

فرم مربوطه :

http://up.vatandownload.com/images/eszzif98bmzj5szkzizg.jpg

کد مربوطه :

private void button1_Click(object sender, EventArgs e)
{

int i = 0, c = windowsFormsApplication1DataSet1.karbar.Rows.Count ;

for (i = 0; i <= c - 1; i++)
{

if (textBox1.Text.Trim() == windowsFormsApplication1DataSet1.karbar.Rows[i][0].ToString().Trim())
{
MessageBox.Show("این نام کاربری قبلا انتخاب شده");
return;
}
}

karbarTableAdapter1.Insert1(textBox1.Text, textBox2.Text.ToString());
MessageBox.Show("اطلاعات با موفقیت ثبت شد");
karbarTableAdapter1.Fill(windowsFormsApplication1D ataSet1.karbar);

}

Y_Safaiee
چهارشنبه 25 مرداد 1391, 13:03 عصر
سلام دوست من

چه کاریه ؟چرا کار خودتو سخت کردی؟!!!

خوب اینطوری بنویس :



private void button1_Click(object sender, EventArgs e)
{
try
{
karbarTableAdapter1.Insert1(textBox1.Text, textBox2.Text.ToString());
MessageBox.Show("اطلاعات با موفقیت ثبت شد");
}

catch
{

MessageBox.Show(".این نام کاربری قبلا انتخاب شده ✖", "توجه ✖", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

karbarTableAdapter1.Fill(windowsFormsApplication1D ataSet1.karbar);

}


اینطوری سعی میکنه اطلاعاتو ذخیره کنه اگه نام کاربری تکراری باشه catch اجرا میشه و ارور میده نام کاربری قبلا ثبت شده است.

در ضمن نام کاربری رو primary کردن اشتباست.

موفق باشی
بایت بایت

sattar1
چهارشنبه 25 مرداد 1391, 13:32 عصر
Youuness (http://barnamenevis.org/member.php?78417-Youuness) جون کارت درسته:تشویق:
ی دنیا ممنون خیلی آقایی

مشکل بر طرف شد

ولی من نمیفهمم این کد الان چجوری اطلاعات دیتا رو چک میکنه

تو کد قبلی که من نوشتم اون حلقه ی For با کد
textBox1.Text.Trim() == windowsFormsApplication1DataSet1.karbar.Rows[i][0].ToString().Trim()
پایگاه رو چک میکرد
اما اینجا تو این کد چجوریه؟:متفکر:
-----------------------------------------------------

"در ضمن نام کاربری رو primary کردن اشتباست." کاملا باهات موافقم
اما ی استاد داشتم تو آز پایگاه
میگفت نام کاربری منحصر به فرد هستش
پس دیگه نیازی به id (کد) نیست

Y_Safaiee
چهارشنبه 25 مرداد 1391, 13:39 عصر
با سلام مجدد

این کد چیزیرو چک نمیکنه, try , catch برای مدیریت خطا استفاده میشه اول سعی میکنه کد داخل try رو اجرا کنه اگه بتونه ثبت میشه اما اگه نام کاربری تکراری باشه برنامه دچار خطا میشه (همون ارور primary key که عکسشو گذاشتی) پس نمیاد به قسمت سورس و خط ارور رو به کاربر نشون بده بلکه میپره قسمت catch و دستورات داخل Catch زو اجرا میکنه.

موفق باشی
بایت بایت

sattar1
چهارشنبه 25 مرداد 1391, 13:45 عصر
بازم ممنون بابت راهنمایی شما - موفق باشید

Farshid007
چهارشنبه 25 مرداد 1391, 14:50 عصر
اما دوست عزیز این راه درستی نیست که با try catch کلک رشتی بزنی!
ممکنه اون لحظه یه خطایی دیگه از SQL سر بزنه!
اون موقع چی ؟
باز هم به کاربر بد بخت می گی نام کاربری ثبت شده!
{این نظر شخصی من بود}

sabzehbzsa
چهارشنبه 25 مرداد 1391, 15:04 عصر
میتونی تو procedure کنترل کنی که اگه این نام کاربری قبلا ثبت شده بود دیگه ثبتش نکنه
BEGIN
IF NOT EXISTS(SELECT * FROM T_User WHERE Name=@Name)
BEGIN
INSERT INTO T_User
(Name,Pass)

VALUES
(@Name,@Pass)


SET @Id=@@IDENTITY
END
ELSE
BEGIN
SET @Id=0
END



END
بعد توی visuall هم مقدار Id رو چک کنه اگه 0 بود بگه قبلا ثبت شده