PDA

View Full Version : سوال: در مورد فرم Login



Milo_22
پنج شنبه 04 فروردین 1390, 13:54 عصر
با سلام به دوستان
من یک فرم لاگین داخل برنامه ام دارم که باید نام کاربری و پسورد رو چک کنه که در صورت اشتباه بودن پیغام خطای مناسبی به کاربر بده و در غیر این صورت به فرم اصلی بره .

چون دارم به صورت لایه ای این کار رو انجام می دم پس با استفاده از STP اومدم یک select نوشتم که یوزر و پسورد رو چک بکنه و صحت وجود را بفرسته به برنامه اصلی .
برای این کار از ExecuteScalar() اسفاده کردم ولی فکر می کنم چون این دستور میاد یک خونه را از جدول چک می کنه و سلول اول در جدول مورد نظر من userID هست برنامه با پیغام خطایی مواجه شده و وارد catch میشه و متوقف میشه .

این دستور داخل برنامه اصلی :

private void btnOK_Click(object sender, EventArgs e)
{
String username = txtUser.Text;
String password = txtPass.Text;

BLL.BLLBase obj = new BLL.BLLBase();
Int32 Res = 0;
try
{
Res = obj.login_user(username, password);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
if (Res == 1)
{
frmMain fMain = new frmMain();
fMain.Show();
}
else
{
lblResult.Text = "اطلاعات ورودی اشتباه می باشد!";
}
}

این دستور داخل لایه BLL :

public int login_user (string username, string password)
{
Boolean bolpass = true;
bolpass = chek_rulse_login_user(username, password);
DAL.DALBase obj = new DAL.DALBase();
int Res = 0;
try
{
if (bolpass == true)
{
obj.login_user_form(username, password);
Res = 1;
}
else
{
Res = 0;
}
}
catch (SqlException)
{
throw;
}
return Res;

}

private Boolean chek_rulse_login_user(string username, string password)
{
Boolean bolres = true;
if ((username.Trim().Length == 0) || (password.Trim().Length == 0 || password.Trim().Length < 6))
{
bolres = false;
}

return bolres;

}

این دستور داخل لایه DAL :

public Boolean login_user_form(String username, String password)
{
object obu,obp;
Boolean ok = false;
cmdchekd = new SqlCommand();
cmdchekd.CommandText = "[dbo].[chek_user]";
cmdchekd.CommandTimeout = 0;
cmdchekd.CommandType = CommandType.StoredProcedure;
con = new SqlConnection(strcon);
cmdchekd.Connection = con;

try
{
con.Open();
obu = cmdchekd.ExecuteScalar();
obp = cmdchekd.ExecuteScalar();
if ((obu != null) && (obp != null))
{
ok = true;
}
con.Close();

}
catch (SqlException)
{
throw;
}

return ok;
}


و این هم STP :

ALTER PROCEDURE [dbo].[chek_user]
@username nvarchar(50) , @password nvarchar(50)
AS
BEGIN

SELECT username , password
FROM tb_user
WHERE username = @username AND password = @password

END


موقع اجرا این پیغام خطلا را میده :

67823

چرا ؟ به همون دلیل استفاده از ExecuteScalar() ؟ یا دلیل دیگه ای داره ؟ ممکنه لطفا کمک کنید ...

ehsanara
پنج شنبه 04 فروردین 1390, 14:28 عصر
هر دو خط
obu = cmdchekd.ExecuteScalar();
obp = cmdchekd.ExecuteScalar();
فقط میاد UserName رو چک میکنه
اگه حتما میخوای که فقط با Scalar کار کنی درغالب دوتا StoreProcedure اجرا کن یکی UserName بده یکی PassWord

shadi khanum
پنج شنبه 04 فروردین 1390, 14:35 عصر
این Error واسه اینه که STP که نوشتین از ورودی دو تا متغیر میگیره @username و @Password . ولی موقع فراخوانی این STP این دو تا متغیر ورودی رو بهش ندادین . ضمنا STP شما چیزی به عنوان خروجی Output نداره !

ehsanara
پنج شنبه 04 فروردین 1390, 14:51 عصر
این Error واسه اینه که STP که نوشتین از ورودی دو تا متغیر میگیره @username و @Password . ولی موقع فراخوانی این STP این دو تا متغیر ورودی رو بهش ندادین . ضمنا STP شما چیزی به عنوان خروجی Output نداره !
این هم درسته
cmdchekd.CommandText = "[dbo].[chek_user] "+username+","+password;

هر دو مورد بالا رو باید درست کنی

Milo_22
پنج شنبه 04 فروردین 1390, 15:10 عصر
هر دو خط
obu = cmdchekd.ExecuteScalar();
obp = cmdchekd.ExecuteScalar();
فقط میاد UserName رو چک میکنه
اگه حتما میخوای که فقط با Scalar کار کنی درغالب دوتا StoreProcedure اجرا کن یکی UserName بده یکی PassWord


آخه این دو تا متغیر هم نام که نیستن ، فرق داره ؟ یعنی باید حتما دو تا جدا باشه تا جواب بده ؟ ولی حتما امتحانش می کنم . ممنون ...

Milo_22
پنج شنبه 04 فروردین 1390, 15:11 عصر
این Error واسه اینه که STP که نوشتین از ورودی دو تا متغیر میگیره @username و @Password . ولی موقع فراخوانی این STP این دو تا متغیر ورودی رو بهش ندادین . ضمنا STP شما چیزی به عنوان خروجی Output نداره !

داخل STP نوشتم که : @username nvarchar(50) , @password nvarchar(50)

چطوری بیام مقداری رو برگشت بدم ؟ میشه راهنمایی کنید ؟

Milo_22
پنج شنبه 04 فروردین 1390, 15:12 عصر
این هم درسته
cmdchekd.CommandText = "[dbo].[chek_user] "+username+","+password;

هر دو مورد بالا رو باید درست کنی

من این قسمتی که شما راهنمایی فرمودین رو درست کردم ولی این پیام رو داد :
67843

ehsanara
پنج شنبه 04 فروردین 1390, 15:27 عصر
این 3خط رو

cmdchekd = new SqlCommand();
cmdchekd.CommandText = "[dbo].[chek_user]";
cmdchekd.CommandType = CommandType.StoredProcedure;
با این جابجا کن
SqlCommand cmdchekd = new SqlCommand("EXEC chek_user "+username+","+password);


ضمنا زمانی که از Sacalar استفاده میکنی فقط اولین فیلد رو میاره و اگه ستنون ها زیاد باشن اخرین فیلد از اولین ستون رو میده یعنی فقط 1قیلد خروجی میده
یعنی obp که نوشتی رو باید با یه StoreProcedure دیگه پر کنی

ehsanara
پنج شنبه 04 فروردین 1390, 15:55 عصر
یه چیز دیگه شما میخوای نتیجه Query رو چک کنی و چون از این Username فقط یکی هست پس اگه جواب بده یعنی درست بوده پس فقط obu کافیه و میتونی با همین کد و همین StoreProcedure چک کنی و obpهلیی که گذتشتی رو حذف کنی و دیگه نیازی به 2 StoreProcedure هم نداری

obu = cmdchekd.ExecuteScalar().ToString();
if (obu != null)
{
ok = true;
}

Milo_22
جمعه 05 فروردین 1390, 21:21 عصر
فکر می کنم چون اولین فیلد داخل جدول من userID هست و فیلد دوم username و فیلد سوم pass نمیشه با ExecuteScalar جواب بگیرم . نمی دونم شایدم اشتباه می کنم ولی همه اش پیغام خطایی میده که نوع داده ای با هم نمی خونه . یعنی دقیقا چیزی شبیه پیغام خطایی که داخل پست اول گذاشتم .
راه دیگه ای برای چک کردن این مقدار وجود داره ؟

Milo_22
جمعه 05 فروردین 1390, 21:23 عصر
میشه از datatable استفاده کنم به جای scalar ؟

ehsanara
شنبه 06 فروردین 1390, 01:03 صبح
اگه میخوای صحت UserPass رو چک کنی نیازی نیست
با همون Scalar هم میشه
یه نمونه کد برا چک کردن UserPass با روشی که نوشتی برات نوشتم ببین ممکنه بدردت بخوره

67885
فقط ConnectionString رو درست کن

ehsanara
شنبه 06 فروردین 1390, 01:08 صبح
راستی من فقط نمونه کد برا جواب گرفتن از DataBase نوشتم برات
چک کردن بزرگ و کوچک بودن حروف و یا Hash کردن پسورد و این مطالب با خودت
گرید ویو رو فرم هم مقادیر جدول UserPass رو نشون میده که کارت برا دیدنشون راحت باشه :چشمک:

ضمنا من برا اینکه شرط رو درست متوجه شی به صورت ساده نوشتمش ولی میتونی جای این شرط

if (cmd.ExecuteScalar() == null)
label3.Text = "Wrong User & Pass";
else
label3.Text = "Accept \n Account Name = " + cmd.ExecuteScalar().ToString();


این رو بنویسی (که بهتر و خلاصه تر هم هست)

label3.Text = cmd.ExecuteScalar() == null ? "Wrong User & Pass" : "Accept \n Account Name = " + cmd.ExecuteScalar().ToString();

Milo_22
دوشنبه 08 فروردین 1390, 12:17 عصر
وااااااااااای دست شما درد نکنه بسیار عالی بود کد تون واسم جواب داد واقعا خدا خیر بده به شما جناب ehsanara (http://barnamenevis.org/member.php?109841-ehsanara) :تشویق: