ExecuteNonQuery语句的返回值是什么?

时间:2015-06-16 05:00:18

标签: c#

我编写了一个程序来使用Visual Studio 10中的3层体系结构来验证用户名和密码。在DAL中,ExecuteNonQuery语句返回“-1”。但如果用户名和密码正确,或者'0'如果不正确,我希望它返回'1'。

针对DAL剪辑的代码:

public class LoginDataAccess
{
    SqlConnection con;
    string constr = ConfigurationManager.ConnectionStrings["localhostakash"].ToString();

    public int LoginData(LoginEntity elOj)
    {
            try
            {
                con = new SqlConnection(constr);
                int result;

                if(ConnectionState.Closed==con.State)
                    con.Open();

                SqlCommand cmd = new SqlCommand("uspuserlogin", con);
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@Username", elOj.Username);
                cmd.Parameters.AddWithValue("@Password", elOj.Password);

                result = Convert.ToInt32(cmd.ExecuteNonQuery());

                return result;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                con.Close();
            }
    }
}

BLL的代码段:

public class LoginLogic
{
        LoginDataAccess lda = new LoginDataAccess();

        public int userValidate(LoginEntity le)
        {
            int result = 0;

            try
            {
                result = Convert.ToInt32(lda.LoginData(le));
            }
            catch (Exception ex)
            {
                //response.write(ex.Message);
            }

            return result;
        }
}

按钮功能的代码段:

protected void Button1_Click(object sender, EventArgs e)
{
            LoginLogic ll = new LoginLogic();
            LoginEntity le = new LoginEntity();

            int v;

            le.Username = TextBox1.Text;
            le.Password = TextBox2.Text;

            v = Convert.ToInt32(ll.userValidate(le));

            if (v == 1)
            {
                Label1.Text = "LOGGED IN SUCCESSFULLY!";
            }
            else
            {
                Label1.Text = "TRY AGAIN...";
            }
}

1 个答案:

答案 0 :(得分:2)

以下是文档:

  

对于UPDATE,INSERT和DELETE语句,返回值是受命令影响的行数。当插入或更新的表上存在触发器时,返回值包括插入或更新操作影响的行数以及受触发器或触发器影响的行数。对于所有其他类型的语句,返回值为-1。如果发生回滚,则返回值也为-1。

在此处阅读更多内容:https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx

您正在调用存储过程“uspuserlogin”。这就是为什么ExecuteNonQuery返回-1。

如果您需要知道操作结果,可以将值作为行返回。

ALTER PROCEDURE [dbo].[uspuserlogin]
    @username nvarchar(255),
    @password nvarchar(255)
AS
BEGIN
    SELECT COUNT(*) AS Found 
    FROM [Users]
    WHERE [Username] = @username AND [Password] = @password
END

在代码中:

var obj = cmd.ExecuteScalar();
return (int)obj;

// Somewhere in code
if (loginDataAccess.LoginData(loginEntity) == 1)
    // Authorize

当然,为方便起见,您可以将其转换为bool

public bool LoginData(LoginEntity elOj)
{
    try
    {
        con = new SqlConnection(constr);
        int result;

        if(ConnectionState.Closed==con.State)
            con.Open();

        SqlCommand cmd = new SqlCommand("uspuserlogin", con);
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@Username", elOj.Username);
        cmd.Parameters.AddWithValue("@Password", elOj.Password);

        var obj = cmd.ExecuteScalar();
        return ((int)obj > 0);
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        con.Close();
    }
}