在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
答案 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
}