如何使用 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();
,所以我在这里也忽略了它。
我是编程新手,这是我第一次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();
,所以我在这里也忽略了它。