无法转换'SingleResult'类型的对象

时间:2014-01-29 07:45:01

标签: c# asp.net asp.net-mvc linq linq-to-sql

在linq to sql,MVC 3中调用存储过程时出错。我只是从SP中检索单个整数,就像选择查询的COUNT结果一样。

ERROR:

System.InvalidCastException: Unable to cast object of type 'SingleResult`1[EmployeeAttendance_app.Models.GetUser_PwdResult]' to type 'System.IConvertible'.

Source Error: 


Line 26:         public ActionResult AfterLogIn(int EmplID, String EmpPwd) 
Line 27:         {
Line 28:             int Num_Rows = Convert.ToInt32(DataContext.GetUser_Pwd(EmplID, EmpPwd));
Line 29:             if (Num_Rows == 1) 
Line 30:             {

代码:

public ActionResult AfterLogIn(int EmplID, String EmpPwd) 
        {
            int Num_Rows = Convert.ToInt32(DataContext.GetUser_Pwd(EmplID, EmpPwd));
            if (Num_Rows == 1) 
            {
                ViewBag.Message = "Logged In";
            }
            else
            {
                ViewBag.Message = "Log-in Failed";
            }
            return View();
        }

SP:这个SP我实际上是从Code调用的,

CREATE PROCEDURE GetUser_Pwd
  @EmplID int,
  @EmplPwd varchar(50)

As  
BEGIN

    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    Declare @No_Rows int
    Select No_Rows= count(*) from HrEmployee where EmplID = @EmplID AND PassWord = @EmplPwd
    Return @No_Rows
END
GO

2 个答案:

答案 0 :(得分:2)

如果您要查看GetUser_Pwd方法签名,您会看到它返回ISingleResult<GetUser_PwdResult>。这就是Linq To Sql如何从存储过程返回数据 - 生成包含结果集中所有字段的新类。即使您将使用存储过程,该过程从映射到数据模型中的实体的表返回数据,也将生成包含表中所有字段的新StoredProcedureNameResult类型。因此,GetUser_PwdResult对象将如下所示:

public partial class GetUser_PwdResult
{
    public Nullable<int> No_Rows { get; set; }
}

这里的问题是这个类和GetUser_PwdResult对象的集合都不能转换为整数。所以你的转换失败了。

因此,您知道结果集合中只有一个返回的对象,您可以从集合中获取第一个项目并读取其No_Rows值:

int? Num_Rows = DataContext.GetUser_Pwd(EmplID, EmpPwd).First().No_Rows;

答案 1 :(得分:1)

DataContext.GetUser_Pwd()函数不会返回int,(或者您可以投放到int的内容),它会返回SingleResult

您可以尝试查看它是int

而不是尝试将其投放到null
var result = DataContext.GetUser_Pwd(EmplID, EmpPwd);
if (result != null) { 
    // logged in
}

编辑以反映更新的问题:

您的SingleResult应包含查询中选择的字段:

var result = DataContext.GetUser_Pwd(EmplID, EmpPwd).First();
if (result.No_Rows == 1) { 
    // logged in
}