如何使用 IDataReader 和 Mapper 从数据库中取出整数

How to get out integer from database using IDataReader and Mapper

我是编程新手,这是我第一次post(问题),所以请不要评判我。

我正在尝试为我的项目构建我的第一个单独的 WCF 服务。让我先展示我的代码,这样会更容易理解。

这是我的数据访问层:

public class DataAccessLayer : IDisposable
{
    string DBConnectionString = "DBCS";

    public int ValidateUser(string employeeLogin, string employeePassword)
    {
        int outputResult = 0;
        try
        {
            DatabaseProviderFactory factory = new DatabaseProviderFactory();

            Database db = factory.Create(DBConnectionString);
            string storedProcedureName = "uspValidateUser";

            DbCommand dbCommand = db.GetStoredProcCommand(storedProcedureName);
            db.AddInParameter(dbCommand, "@EmployeeLogin", DbType.String, employeeLogin);
            db.AddInParameter(dbCommand, "@EmployeePassword", DbType.String, employeePassword);
            db.AddOutParameter(dbCommand, "@OutRes", DbType.Int32, outputResult);

            using (IDataReader reader = db.ExecuteReader(dbCommand))
            {
                Mapper.Reset(); 
                Mapper.CreateMap<IDataReader, Int32>();
                outputResult = (int)Mapper.Map<IDataReader, Int32>(reader);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }

        return outputResult;
    }

    public void Dispose()
    {
    }
}

这是我的存储过程:

ALTER PROCEDURE [dbo].[uspValidateUser] 
    @EmployeeLogin VARCHAR(20),
    @EmployeePassword VARCHAR(20),
    @OutRes int Output
AS
    SET @OutRes = (select count(*) 
                   from dbo.tblEmployee 
                   where EmployeeLogin = @EmployeeLogin 
                     and EmployeePassword = @EmployeePassword)

    if (@OutRes = 1)
    BEGIN
        SET NOCOUNT ON;
        set @OutRes = 1 --Login is correct
    end
    else
    BEGIN
        set @OutRes = 0 -- Login is incorrect
    END

我的网络表单背后的代码:

public int ValidateUser(string employeeLogin, string employeePassword)
{
    int outputResults = 0;

    try
    {
        using (HospitalWCFService.ContractsClient objWCFService = new HospitalWCFService.ContractsClient())
        {
            outputResults = objWCFService.ValidateUser(employeeLogin, employeePassword);
        }
    }
    catch (Exception ex)
    {
        lgnEmployeeLogin.FailureText = ex.Message;
    }

    return outputResults;
}

protected void ValidateUser(object sender, AuthenticateEventArgs e)
{
    int outputResults = 0;

    outputResults = ValidateUser(lgnEmployeeLogin.UserName, lgnEmployeeLogin.Password);

    if (outputResults == 1)
    {
        Session["UserName"] = lgnEmployeeLogin.UserName.ToString(); 
            FormsAuthentication.RedirectFromLoginPage(lgnEmployeeLogin.UserName, lgnEmployeeLogin.RememberMeSet);
    }
    else
    {
        lgnEmployeeLogin.FailureText = "Username and/or password is incorrect.";
    }
}

为了获取用户凭据,我正在使用登录控件 lgnEmployeeLogin

我在使用 Mapper 从数据库中检索输出整数 @OutRes 参数时遇到问题(我需要使用 mapper

如果可能,请尽可能用最简单的语言解释解决方案,因为我可能听不懂难懂的技术术语。

提前谢谢大家!

你没有答案可能是因为你说你必须使用 mapper - 但我选择忽略它,因为 ExecuteReader 用于处理存储的返回的行和列过程,而不是它的输出参数。您提供的存储过程有没有个结果集!

这可以像

一样简单
db.ExecuteNonQuery();
OutputResult = db.Parameters( "@OutRes").value

需要说明的是,这会替换您的 using...ExecuteReader

另请注意:您的代码没有处理打开(和关闭)SQL 连接(db.Connection.Open();,所以我在这里也忽略了它。