在调用存储过程的方法中返回值

本文关键字:返回值 方法 调用 存储过程 | 更新日期: 2023-09-27 18:29:42

我在C#代码中使用Microsoft.Practices.EnterpriseLibrary访问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

在调用存储过程的方法中返回值

此错误是因为对象是以下语句的返回。

login=  db.ExecuteScalar(command);

你必须做一些类似的事情

login=  (Model.Login)db.ExecuteScalar(command);

但这并不能解决您的问题,因为ExecuteScalar不会返回.net类型的Login。只有当您从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) };
  } 

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块。默默地吃破例从来都不是好事。。。可能出了什么问题,而你永远不会知道。