ورود

View Full Version : سوال: خروجی Executescalar همیشه NULL است؟؟؟



s_h280
شنبه 14 خرداد 1390, 07:50 صبح
سلام
یه فرم ثبت نام داریم که میخوایم قبل از ثبت نام شخص ببینیم که UserName از قبل وجود داره یا نه که اگه وجود داره اجازه ثبت نام رو ندیم.
برای این کار تو SQL یه Function نوشتم که وجود یک User رو بررسی میکنه
به این شکل:




CREATE PROCEDURE [dbo].[CheckForUsernameExists]

(
@Username nVarchar(100)
)

AS

IF EXISTS (SELECT UserName from Register WHERE UserName = @Username)
Return 0
Else
Return 1



حالا با زدن دکمه ثبت نام میخوام از این تابع استفاده کنم ببینم User وجود داره یا نه. تابع C# هم به شکل زیره:




protected void Button1_Click(object sender, EventArgs e)
{
SqlConnection connection = Utility.CreateConnection();
SqlCommand command = new SqlCommand("CheckForUsernameExists",connection);
command.CommandType = CommandType.StoredProcedure;
SqlParameter parameter = new SqlParameter("@UserName", UserNameTextBox.Text);
command.Parameters.Add(parameter);
int resault = -1;
try
{
connection.Open();
resault = (int)command.ExecuteScalar();
}
catch (Exception)
{
}
finally
{
if (connection.State == ConnectionState.Closed)
connection.Close();
}
if (resault == 0)
{
//رد عملیات ثبت نام
}
else
{
//ثبت نام
}
}


تابع Utility.CreateConnection هم کار خاصی نمیکنه فقط با ConnectionStringی که اونجا تعریف شده یه SQLConnection میسازه و تحویل میده

حالا مشکل اینجاست که تابع Executescalar همیشه Null بر میگردونه...:متفکر:
کمک...

Alfred188
شنبه 14 خرداد 1390, 10:30 صبح
سلام،
من از SQL زیاد سر در نمی یارم فقط در حدی که کارم راه بیوفته!
اما کاری که می کنم اینه:
select id from table_X where username='"+ تکست باکس username +"'
اگه خروجی null بود دستور insert رو انجام می ده وگرنه می گه نام کاربری وجود داره !

hamid_m6070
یک شنبه 04 دی 1390, 09:32 صبح
سلام من همین امروز با ExecuteScalar کار کردم با استفاده از select @@Identity وفراخونی آون تونستم مقدار رو دریافت کنم شاید بدرد شما هم خورد شاید هم نه ببخشید که من زیاد کد نویسیم خوب نسیت تازه شروع کردم


publicobject Insert(Common.Data.LoginInfo Login)

{
using (SqlCommand cmd = newSqlCommand())

{


string cmdformat = string.Format("insert into {0} ({1},{2},{3},{4}) Values (@{1},@{2},@{3},@{4}); select @@Identity;"

, Common.Data.
LoginInfo.TableName

, Common.Data.


LoginInfo.UserNameField

, Common.Data.



LoginInfo.passField

, Common.Data.

LoginInfo.ActiveField

, Common.Data.


LoginInfo.NoUserIDField);

cmd.CommandText = cmdformat;

Addparameters(cmd,Login);

cmd.Connection =



this.GetConnection();

cmd.Connection.Open();


try

{

cmd.ExecuteNonQuery();









object id = cmd.ExecuteScalar();





return id;

}







catch (Exception ex)

{

Common.





GeneralException ex1 = new Common.GeneralException(Common.ResourceMessage.Ero rrNoSabt, ex);





throw ex1;

}

}

hakan648
یک شنبه 04 دی 1390, 09:58 صبح
سلام

SP رو باید به این شکل بنویسید ( Stored Procedure با Function فرق داره ! ) :

CREATE PROCEDURE [dbo].[CheckForUsernameExists]

(
@Username nVarchar(100)
)

AS

BEGIN

SELECT COUNT(*) FROM Register WHERE UserName = @UserName

END


در ضمن بهتره که یک متد جداگانه برای چک کردن نام کاربری بنویسید - در کل به این شکل :

protected void Button1_Click(object sender, EventArgs e)
{
if (!UserExist(UserNameTextBox.Text))
{
// Add New User
}
else
{
// Deny Registration
}
}

private bool UserExist(string username)
{
SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationMa nager.ConnectionStrings["ConStr"].ConnectionString);
SqlCommand command = new SqlCommand("CheckForUsernameExists", connection);
command.CommandType = CommandType.StoredProcedure;
SqlParameter parameter = new SqlParameter("@UserName", username);
command.Parameters.Add(parameter);
int resault = 0;
try
{
connection.Open();
resault = (int)command.ExecuteScalar();
}
catch (Exception)
{
}
finally
{
if (connection.State == ConnectionState.Closed)
connection.Close();
}
if (resault == 0)
{
return false;
}
else
{
return true;
}
}

موفق باشید ...:لبخندساده: