我使用Microsoft.Practices.EnterpriseLibrary
在我的C#代码中访问SQL Server数据库。我有一个方法调用存储过程并将参数发送到存储过程,该存储过程返回一行(用户名和密码)。
我不确定如何返回此方法中的值。
这是我的代码:
public Model.Login GetUsernameandPasswordByPartnerID(int partnerId)
{
Model.Login login;
string myConnection = System.Configuration.ConfigurationManager.ConnectionStrings[connectionName].ToString();
SqlDatabase db = new SqlDatabase(myConnection);
using (DbCommand command = db.GetStoredProcCommand("AS_AuthenticateByPartner"))
{
db.AddInParameter(command, "partnerID", DbType.String, partnerId);
try
{
login = db.ExecuteScalar(command); //error on this line
// rtn = Message("Success", "Acquisition", "GetLogin", "Service", db.ExecuteScalar(command).ToString());
}
catch (Exception ex)
{
}
db = null;
return login;
}
}
和我的Model.login
public class Login
{
public string username;
public string password;
}
我不确定应该怎么做这句话:
login= db.ExecuteScalar(command);
现在我收到错误,因为您无法将对象显式转换为Model.login
。
答案 0 :(得分:0)
ExecuteScalar
方法通常用于从数据库返回单个值。
试试这个。我假设存储过程最多只返回 一条带有匹配用户名和密码的记录。
using (var command = db.GetStoredProcCommand("AS_AuthenticateByPartner"))
{
db.CommandType = CommandType.StoredProcedure;
db.AddInParameter(command, "partnerID", DbType.String, partnerId);
// make sure myConnection is open before querying the database
var reader = db.ExecuteReader();
if (!reader.HasRows)
return null; // no records found... return null? display error?
reader.Read();
return new Login {username = reader.GetString(0), password = reader.GetString(1)};
}
此代码指定命令文本是存储过程。作为查询的结果,它使用ExecuteReader()
从数据库中获取(可能)多条记录。
另外,FWIW,不要使用空的catch
块。悄悄地吃异常从来都不是好事......有些事情可能会出错,你永远不会知道它。
答案 1 :(得分:0)
此错误是因为对象是以下语句的返回。
login= db.ExecuteScalar(command);
你必须做这样的事情
login= (Model.Login)db.ExecuteScalar(command);
但这并不能解决您的问题,因为ExecuteScalar不会返回.net类型登录。它仅在从SQL Server返回int,string等时才有用。为了解决这个问题,我需要知道存储过程的返回值。
如果我认为你要归还这样的东西
select username,password from tblUser
然后你不能使用ExecuteScalar,因为它只用于返回单个值。
你必须做这样的事情。
Model.Login model = null;
var result = db.ExecuteReader();
if (!reader.HasRows)
model = null;
else
{
reader.Read();
model = new Model.Login(){ UserName = reader.GetString(0) , Password= reader.GetString(1) };
}