PDA

View Full Version : عدم تکرار نام کاربری در زمان ثبت نام



rayson
شنبه 01 بهمن 1390, 19:32 عصر
سلام دوستان.
من برای سایت خودم قسمت ثبت نام کاربر گذاشتم و کدش را هم نوشتم .
درخواست من ایه که من میخوام اگر نام کاربری تکراری وارد شد پیغام خطا بده اما نمیدونم از چه کدی استفاده کنم لطفا اگر امکانش هست من را راهنمایی کنید.
از DB 2000 استفاده میکنم.
یک سوال دیگه داشتم DB 2000 SQL میشه آپلود کرد برای سایت ؟

mp_mp353
شنبه 01 بهمن 1390, 20:37 عصر
باید اول داخل جدول کاربرها متن داخل تکس (نامکاربری) رو جستجو کنه اگه جستجو نتیجه داشت یعنی اون نام قبلا ثبت شده و تکراری هست اما اگه نتیجه نداشت (پیدا نشد) یعنی اون نام در داخل نام های ثبت شده نیست و میتونه ثبت بشه

shadi khanum
شنبه 01 بهمن 1390, 22:29 عصر
باید با دیتابیست چک بشه که این نامی که کاربر وارد کرده قبلا تو دیتابیس نبوده باشه. همچنین اگه میخوای نام کاربر تکراری نباشه رو اون فیاد تو دیتابیس index unique بذار
موفق باشی

rayson
یک شنبه 02 بهمن 1390, 14:26 عصر
ممنون دوستان اما من میدونم باید با نام کاربری مقایسه بشه . اما من یه نمونه کد میخواستم .
چون تا حالا به این قسمت برنخورده بودم و ذهنیتش ندارم که کدش بنویسم اگه یک نمونه کد به من بدید ممنون میشم.

mp_mp353
یک شنبه 02 بهمن 1390, 15:06 عصر
این مال یه برنامه است که خیلی وقت پیش با سی شارپ نوشتم شاید به دردت خورد دوست من
private void btnenter_Click_1(object sender, EventArgs e)
{
for (int i = 0; i < txtpass.Text.Length; i++)
{
if (txtpass.Text[i]=='\'')
{
MessageBox.Show("توجه در پسورد و شناسه از علائم(',\",.,\\,;,?,@,...) نباید استفاده شود!", "", MessageBoxButtons.OK, MessageBoxIcon.Warning);
txtid.Clear();
txtpass.Clear();
txtid.Select();
return;
}
}
for (int i = 0; i < txtid.Text.Length; i++)
{
if (txtid.Text[i] == '\'')
{
MessageBox.Show("توجه در پسورد و شناسه از علائم(',\",.,\\,;,?,@,...) نباید استفاده شود!", "", MessageBoxButtons.OK, MessageBoxIcon.Warning);
txtid.Clear();
txtpass.Clear();
txtid.Select();
return;
}
}
OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|HelalDb.mdb;Jet OLEDB:Database Password=12344321;");
//string oledbConnectString ="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|hdb.accdb;Jet OLEDB:Database Password=12344321;";
con.Open();
string s="select * From users where id='" + txtid.Text + "' and pass='" + txtpass.Text + "'";
OleDbDataAdapter da = new OleDbDataAdapter(s, con);
DataSet ds = new DataSet();
da.Fill(ds, "users");
if (ds.Tables[0].Rows.Count == 0)
{
MessageBox.Show("اطلاعات ورودی اشتباه است لطفا دوباره سعی کنید", "Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
txtpass.Clear();
txtid.Clear();
txtid.Select();
return;
}
else
{
Program.gp.right = ds.Tables[0].Rows[0][2].ToString();
Program.gp.struser = ds.Tables[0].Rows[0][0].ToString();
m2 = 1;//becuse if this window closed we can understand clicked on close and exit from form or type a true pass and close form to general part
Close();
}
}

shadi khanum
یک شنبه 02 بهمن 1390, 21:14 عصر
فرض کن یه متغیر به اسم cmd از نوع SQLCommand داری.. و یه textbox که نام کاربری رو توش وارد میکنن.حالا میخوای چک کنی که قبلا این نام توسط کسی دیگه انتخاب نشده باشه..


cmd.commandtext="select count(*) from tbl_users where usr_name = ' & textbox1.text & "'"
dim res as integer
res=cmd.ExecuteScalar()
if res > 0 then
msgBox("some one choose this username befor, try another!")
else
//Insert new user to table
End IF

rayson
سه شنبه 04 بهمن 1390, 18:58 عصر
دستور گذاشتم اما خطا میده لطفا کمک کنید:
http://img4up.com/up2/44926446953766778791.jpg

Hybrid
سه شنبه 04 بهمن 1390, 19:24 عصر
دوست عزیز کوتیشن رو ببند... بعد از & txt_user.text یک '(تک کوتیشن) رو قرار بده....

این روش شما درسته ولی روش خوبی نیست میتونین از پارامتر استفاده کنین...

موفق باشید./

rayson
سه شنبه 04 بهمن 1390, 20:14 عصر
دوست عزیز ممنون خطا برطرف شد.
فقط مشکلش اینه که اگر نام کاربری تکراری وارد شد بازم ذخیره میکنه و خطا نمیده که تکراری است.
به نظر شما در جا گذازی کد ها مشکلی نیست ؟

Hybrid
سه شنبه 04 بهمن 1390, 21:06 عصر
کاملا جای کداتون اشتباهه !

کد مربوط به اضافه کردن رو بعد از Else کات کن تا مشکل رفع بشه... شما اومدین اول اضافه میکنین بعد چک میکنین ... جاشون رو عوض کنین..

توضیح کامل : از Dim cmd as new sqlCommand تا خط بالای dim res as integer کات کن و زیر Paste , Else کن...

موفق باشید./

rayson
چهارشنبه 05 بهمن 1390, 02:40 صبح
سلام
من جابه جا کردم دقیقا چیزی که گفتید اما بازم خطا میده.
شما گفتید از Dim cmd as new sqlcommand کات کنید یعنی خودش هم هست. جابه جا کردمتا قبل ار
Dim res as new integer اما دستور زیر Dim cmd as new sqlcommand خطا گرفت چون از cmd استفاده میکرد ، من مجبور شدم برای چک کردن از یه متغییر دیگه استفاده کنم بازم خطا گرفت و فکر کنم بازم چندتا کد جا به جا هستند مثل دستو ر select بی زحمت چک کنید من متوجه نمیشم .
و یک سوال دیگه: نیمخواد دستور Imports System.InvalidOperationException داشته باشه ؟
ممنون.

Hybrid
چهارشنبه 05 بهمن 1390, 10:20 صبح
1 ) نه این فضای نامی اصلا لازم نیست..

2) دوست عزیز اگه دقت کنین تو کدهاتون ( الان متوجه شدم ببشخشید ) شما اومدین نوشتین Dim cmd as new sqlcommand خوب ، ولی اومدین 2 تا دستور commandText رو بهش نسبت دادین یعنی یه بار تو خط پنجم و یه بار دیگه تو خط 14 خوب این اصلا امکان پذیر نیست از یه کانکشن 2 دستور به طور هم زمان و با یه SQlcommand اجرا بشه .. پس اصلاح میکنم از Dim cmd as new sqlCommand ، (خودش هم جز خطوطه) تا خط 14 ( با احتساب اینتری که واسه جدا کردن خطوط به کار بردین ) باید کات کنین و زیر Else قرار بدین ...

3) واسه دستور Select Count هم یه SQLCOmmand دیگه رو به کار ببرین ببرین مثلا طبق این مثال که واستون زدم :


Dim Cmd2 As New OleDbCommand
Cmd2.Connection = oledbconnection1
Cmd2.CommandType = CommandType.Text
Cmd2.CommandText = "Select Count(*) from _Login Where UserName=' & txt_user.Text & '"

یعنی 2 تا کامند درست کنین.

امیدوارم توضیحاتم رو متوجه شده باشین./

rayson
چهارشنبه 05 بهمن 1390, 11:12 صبح
سلام دوست من .
بازم مشکل داره عکس میزارم از خطا.
و یه سوال اکه 2تا CMD باید داشته باشه پس نمیخواد 2 تا Con هم داشته باشه ؟
و نمیخواد برای چک کردن تکراری بودن con.open and Close بشود ؟
خط cmd2.CommandType = CommandType.Text من متوجه نشدم چه عملی انجام میده میشه توضیح بدید؟
81428
ممنون دوست من .

Hybrid
چهارشنبه 05 بهمن 1390, 11:40 صبح
دوست عزیز این اشکال میگه کانکشن شما بسته هست ( فکر کنین اگه کانکشن بسته باشه چطور میخوای با بانک ازتباط برقرار کنی؟؟؟)،

مجبور شدم این مثال رو واستون بزنم ( کاملا تست شده و بدور از اشکال) ، به باز و بسته شدن کانکشن ها خوب توجه کن ...


Dim oledbConnection1 As New OleDbConnection
oledbConnection1.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=G:\Access Bank\Database1.accdb"

Dim oledbCommand1 As New OleDbCommand
oledbCommand1.Connection = oledbConnection1
oledbCommand1.CommandType = CommandType.Text
oledbCommand1.CommandText = "Select Count(*) from Table1 Where Name=@Name"
oledbCommand1.Parameters.AddWithValue("@name", TextBox1.Text)
oledbCommand1.Connection.Open()
Dim res As Byte = oledbCommand1.ExecuteScalar()
oledbConnection1.Close()
If res > 0 Then
MessageBox.Show("این نام کاربری قبلا ثبت شده")
Else
Dim oledbCOmmand2 As New OleDbCommand
oledbCOmmand2.Connection = oledbConnection1
oledbCOmmand2.CommandType = CommandType.Text
oledbCOmmand2.CommandText = "Insert into Table1(name,FName,Address) values(@name,@Fname,@Address)"
With oledbCOmmand2.Parameters
.AddWithValue("@name", TextBox1.Text)
.AddWithValue("@Fname", TextBox2.Text)
.AddWithValue("@Address", TextBox3.Text)
End With

If oledbCOmmand2.Connection.State <> ConnectionState.Open Then
oledbCOmmand2.Connection.Open()
End If
oledbCOmmand2.ExecuteNonQuery()
MessageBox.Show("ثبت شد")
oledbCOmmand2.Connection.Close()
End If

اشکال کد شما اینه که قبل از Execute Scalar نیومدید کانکشن رو باز کنید... برای رفع این مشکل اول قبل از Scalar کانکشن رو باز کنید سپس بعد از ExecuteScalar بیایین کانکشن رو ببندین... بعد تو SqlCommand بعدی به همین ترتیب اول باز سپس بسته( البته cmd.connection.Close رو تو خط آخرین بنویسید)..به مثال خوب توجه کن.

موفق باشید./

rayson
چهارشنبه 05 بهمن 1390, 15:35 عصر
سلام دوست من .
من طبق گفته های شما پیش رفتم خطا بر طرف شد اما بازم وقتی کاربر تکراری وارد میشه خطا نمیگیره.
یک نکته: زمانی که res>=0 فرار میدم زمانی که نام کاربری وارد میکنم پیغام تکراری بودن میده حتی برای نام کاربری های غیر تکراری .
و همچنین نیاز که من کد (cmd.Parameters.AddWithValue("@user", txt_user.Text در خط 8 وارد کنم؟
81445

Hybrid
چهارشنبه 05 بهمن 1390, 16:17 عصر
بابا دوست عزیز خداییش زبونم داره مو درمیاره ... مگه نمیگم 2 تا کاممند اضافه کن...شما باز هم اومدین 1 SQlCommand رو اضافه کردین اصلا به کد من شما دقت کردین؟؟؟؟

یه SQlCommand دیگه رو اضافه کن و زیر Else دستوراتش رو اضافه کن...

به مثالی که واستون زدم خوب توجه کن که زیر Else چه دستوری گذاشتم./.

توضیح کامل :

1) کد های زیر رو بین Else و Dim ins as string قرار بده.


Dim cmd2 As New SqlCommand
cmd2.Connection = con
cmd2.CommandType = CommandType.Text

2)تمامی Cmd های بعد از Else رو به cmd2 تغییر بده.

اگه باز هم مشکل داشت به مثالی که واست زدم خوب توجه کنی مشکلت حل میشه.

موفق باشید./

rayson
چهارشنبه 05 بهمن 1390, 19:09 عصر
سلام دوست من .
شرمنده شما دیگه از دسته ما آسایش نداری ، ببخشید .
خدمت شما بگم که این کد شما هم اضاف کردم.
تاثیری نداشت .
ببینید مشکل اینه که نام کاربری را چک نمیکنه که تکراری یا نه ولی ذخیره میکنه ، این یعنی داخل کد چک کردن نام کاربری مشکلی است اون قسمت دچار مشکل یک جایش که چک نمیکنه.
81457

Hybrid
چهارشنبه 05 بهمن 1390, 20:31 عصر
دوس عزیز این کدی رو که تو تصویر هست رو کلا کپی کن و به صورت کد داخل یه پست قرار بده تا اصلاحش کنم و تحویل بدم..

موفق باشید./

shadi khanum
چهارشنبه 05 بهمن 1390, 22:05 عصر
دوست عزیز اگه یه کم دقت کنی و بیشتر مطالعه کنی انقد به خاطر یه مشکل کوچولو درگیر نمیشی..
موضوع اصلا انقد که فک میکنی سخت نیست، نیاز به دو تا command و .. هم نداره.. این Sample رو با دقت ببین حتما مشکلت به راحتی حل میشه
موفق باشی

rayson
پنج شنبه 06 بهمن 1390, 12:09 عصر
سلام دوستان.
مشکل از خط '" + txt_user.Text + "'" بود کوتیشن کم بود واسه همین اجرا نمیشد.
فقط من نفهمیدم عملکرد خط cmd.CommandType = CommandType.Text چیه میشه توضیح بدید ؟
ممنون واسه همه چیز.

Hybrid
پنج شنبه 06 بهمن 1390, 12:20 عصر
سلام خدا رو شکر مشکلت حل شد .

در حالت کلی (داخل Ado.net) شما برای اینکه 4 عمل اصلی رو روی بانک انجام بدین 2 روش وجود داره...

1) خودتون مستقیما بیای دستورات رو تایپ کنی مثل مثال های بالا که اون میشه cmd.CommandType = CommandType.Text.(پس این کد یعنی من میخوام خودم مستقیما دستورات رو تایپ کنم)

2) روش دوم اینه که بیای از StoredProcedure استفاده کنین که اون میشه cmd.CommandType=CommandType.StoredProcedure.( پس این خط یعنی من میخوام برای انجام این دستور از Stored procedure موجود در بانک sql استفاده کنم)


پس :

Commandtype.text : در صورتی که قصد دارین دستورات SQL مورد نظرتان رو روی بانک اجرا کنید باید این نوع رو انتخاب نمایید و سپس دستورات sql مورد نظر رو در CommandText وارد کنید(مثل مثال های بالا )

Commandtype.StoredProcedure : در صورتی که قصد دارید یک روال ذخیره شده قبلی در بانک رو اجرا کنید باید این مقدار رو انتخاب کنید و سپس در CommandText تنها نام روال ذخیره شده رو قرار بدین.

موفق باشید./