如果找到记录,则返回一个int,如果没有找到数据,则返回false

问题描述:

我有一种从学生表中获取成绩的方法。如果没有记录(空结果集),那么它应该返回false。如果找到记录,则返回一个int,如果没有找到数据,则返回false

我是否写一个返回布尔型(找到,未找到)和整数作为参考参数的函数?

这是我迄今(我返回-1从PROC如果没有找到记录)

public static int getParticipationGrade(SqlConnection sqlConn, int enrollmentID) 
{ 
    SqlCommand sqlCmd = new SqlCommand("dbo.usp_participation_byEnrollmentID_Select", sqlConn); 
    sqlCmd.CommandType = CommandType.StoredProcedure; 
    sqlCmd.Parameters.AddWithValue("@enrollmentID", enrollmentID); 

    int ret = 0; 
    sqlConn.Open(); 
    ret = (int)sqlCmd.ExecuteScalar(); 
    sqlConn.Close(); 
    return ret; 
} 
+1

是的,一个'int`作为`ref`参数是有道理的 - 它与Dictionary.TryGetValue相当相似。如果没有记录, – 2011-02-08 23:56:26

+1

是否需要返回`false`?调用方法是否可以检查-1返回值? – vlad 2011-02-08 23:56:38

+0

嗨,不涉及你的主要问题......你可以把SqlCommand的声明放在一个using语句中,你可以创建一个简单的命令sqlConn.CreateCommand :) – 2011-02-08 23:58:16

我将返回INT? null表示未找到。

public static int? getParticipationGrade(SqlConnection sqlConn, int enrollmentID) 
{ 
    SqlCommand sqlCmd = new SqlCommand("dbo.usp_participation_byEnrollmentID_Select", sqlConn); 
    sqlCmd.CommandType = CommandType.StoredProcedure; sqlCmd.Parameters.AddWithValue("@enrollmentID", enrollmentID); 
    int ret = 0; 
    sqlConn.Open(); 
    ret = (int)sqlCmd.ExecuteScalar(); 
    sqlConn.Close(); 
    return ret < 0 ? (int?) null : ret; 
} 
+0

这绝对是最好的选择。 – Snowbear 2011-02-08 23:59:11

你可以有方法返回一个object,然后进行测试,看看是什么类型,但不是通常一个好主意。可能会更好的是返回一个可为空的int int?,然后检查HasValue属性。如果找不到任何内容,则返回null,如果找到,则返回整数。

我认为“GetParticipationGrade”的语法意味着它的返回值应该是等级本身。这似乎是有道理的返回一个无效的值,如-1或NULL(根据其他答案,这也是我的选择以及*),然后检查以确保等级是有效的。例如,当然这就是所有的约定,但你只能期望从诸如TryParse()的方法返回布尔值。

* 为了解释,我更喜欢int?到像-1这样的哨兵等级,因为对于您想要执行的检查来说,建立可空值类型(HasValue属性)。

使用你的代码为例,我会做这样的事情:

public bool TryGetParticipationGrade(SqlConnection sqlConn, out int enrollmentID) 
{ 
    SqlCommand sqlCmd = new SqlCommand("dbo.usp_participation_byEnrollmentID_Select", sqlConn); 
    sqlCmd.CommandType = CommandType.StoredProcedure; 
    sqlCmd.Parameters.AddWithValue("@enrollmentID", enrollmentID); 

    sqlConn.Open(); 
    enrollmentId = (int)sqlCmd.ExecuteScalar(); 
    sqlConn.Close(); 
    return enrollmentId != -1;   
} 

用法:

int enrollmentId; 
if (TryGetParticipationGrade(sqlConn, out enrollmentId)) 
{ 
    // perform success tasks 
} 
else 
{ 
    // perform fail tasks 
}