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

RETURNT-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

ExecuteNonQuery の代わりに ExecuteScalar を呼び出し、ストアド プロシージャで 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 に答える