2011-02-08 11 views
0

生徒用のテーブルから成績を取得するメソッドがあります。レコードがない場合(nullの結果セット)、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

をはい、 'ref'パラメータとして' int'は理にかなっている - それは'Dictionary.TryGetValue'にかなり類似しています。 –

+1

レコードがない場合は 'false'を返す必要がありますか?呼び出しメソッドは-1の戻り値をチェックできますか? – vlad

+0

こんにちは、あなたの主な質問には関係ありません...あなたはusingステートメントにSqlCommandの宣言を置くことができ、単純にsqlConn.CreateCommandを実行してコマンドを作成することができます:) –

答えて

8

私は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

+0

これを行うにはどのようにコードを変更する必要がありますか?ローカルintもintでなければならないでしょうか? – Caveatrob

+0

@Caveatrob必ずしもそうではありませんが、メソッドがnull可能な 'int'を返すようにする必要があります。 –

0

あなたは、メソッドがobjectを返す必要があり、その後のタイプが何であるかを確認するためにテストし、それは一般的に良いアイデアではありませんでした。おそらく、null可能なint int?を返し、次にHasValueプロパティをチェックする方が良いでしょう。見つからない場合はnullを返し、見つかった場合は整数を返します。

+1

私は最初の行を読んだとき、これをほとんど落としました。あなたが推奨する順序を逆にするかもしれません。 :-) –

0

"GetParticipationGrade"の構文は、戻り値がグレード自体であることを意味すると考えます。 -1やNULLなどの無効な値を返すことは意味があるようです(他の答えにも当てはまる*)。そして、そのグレードが有効であることを確認してください。

もちろんこれはすべての規約ですが、例えばTryParse()のようなメソッドからのブール戻りが予想されます。

* 説明すると、チェック可能なチェックの種類のためにnullable値の型が(HasValueプロパティ)が組み込まれているため、-1のようなセンチネルグレードにはint?が好きです。

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;   
} 

使用:例として、あなたのコードを使用して

1

、私のようなものだろう

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

+1このメソッドは 'Dictionary.TryGet()'の実践に従っているからです。私は個人的には、int型へのnullable参照を作成するよりも、この方が好きです。 – IAbstract

+0

これは見つからなければprocは-1を返します。ゴッチャ。 – Caveatrob

関連する問題