4

我有一个存储过程,它返回学生是否被锁定:

RETURN @isLocked

我执行这个存储过程,如:

    public int IsStudentLocked(string studentName, int lockoutTime)
    {
        SqlConnection connObj = new SqlConnection();
        connObj.ConnectionString = Util.StudentDataInsert();
        connObj.Open();

        SqlCommand comm = new SqlCommand("uspCheckLockout", connObj);

        comm.CommandType = CommandType.StoredProcedure;

        comm.Parameters.Add(new SqlParameter("@Studentname", studentName));
        comm.Parameters.Add(new SqlParameter("@LockoutTime", lockoutTime));

        comm.ExecuteNonQuery();
        connObj.Close();

        //How can I return the @isLocked value below?
        return ((int)(@isLocked));

    }
4

3 回答 3

18

RETURN在 T-SQL 中使用该语句(只能返回整数值),您必须添加一个参数来检索它:

public int IsStudentLocked(string studentName, int lockoutTime)
{
    SqlConnection connObj = new SqlConnection();
    connObj.ConnectionString = Util.StudentDataInsert();
    connObj.Open();

    SqlCommand comm = new SqlCommand("uspCheckLockout", connObj);

    comm.CommandType = CommandType.StoredProcedure;

    comm.Parameters.Add(new SqlParameter("@Studentname", studentName));
    comm.Parameters.Add(new SqlParameter("@LockoutTime", lockoutTime));

    var returnParam = new SqlParameter
    {
        ParameterName = "@return",
        Direction = ParameterDirection.ReturnValue
    };

    comm.Parameters.Add(returnParam);

    comm.ExecuteNonQuery();

    var isLocked = (int)returnParam.Value;
    connObj.Close();

    return isLocked;

}

但是,这有点混乱(IMO)。通常我在这种情况下所做的是将SELECT我想要的值作为存储过程中的最后一条语句。然后我ExecuteScalar在命令对象上使用来检索值而不是ExecuteNonQuery.

过程:

... SQL ...

SELECT @isLocked

方法:

public int IsStudentLocked(string studentName, int lockoutTime)
{
    using(SqlConnection connObj = new SqlConnection())
    {
        connObj.ConnectionString = Util.StudentDataInsert();
        connObj.Open();

        SqlCommand comm = new SqlCommand("uspCheckLockout", connObj);

        comm.CommandType = CommandType.StoredProcedure;

        comm.Parameters.Add(new SqlParameter("@Studentname", studentName));
        comm.Parameters.Add(new SqlParameter("@LockoutTime", lockoutTime));

        return (int)comm.ExecuteScalar();
    }
}
于 2012-07-06T21:56:34.590 回答
3

您应该调用 ExecuteScalar 而不是 ExecuteNonQuery 并将 RETURN 替换为 SELECT 在您的存储过程中。

顺便说一句,你应该用using块包装你的连接,这样即使在 Close() 之前发生了一些异常,它也会被正确处理。

于 2012-07-06T21:52:57.293 回答
0

如果 @IsLocked 存储过程中的输出参数

System.Data.SqlClient.SqlParameter paramterIsLockedOut = command1.Parameters.Add("@MyParameter", SqlDbType.SmallInt);
paramterIsLockedOut.Direction = ParameterDirection.Output;
command1.ExecuteNonQuery();

int newValue = (int)paramterIsLockedOut.Value;
于 2012-07-06T21:59:24.863 回答