0

C# .NET Framework 4.0 ライブラリを開発しています。

私はこのコードを持っています:

public static byte GetBatchStatus(string connString)
{
    if (string.IsNullOrEmpty(connString))
        throw new ArgumentNullException("connString");

    byte status;

    using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(connString))
    {
        conn.Open();

        SqlCommand cmd = new SqlCommand();

        cmd.CommandText = GetBatchStatusValueSQL;
        cmd.CommandType = CommandType.Text;
        cmd.Connection = conn;

        object o = cmd.ExecuteScalar();
        // Throws an ArgumentNullException if o is null.
        if (o == null)
            throw new ArgumentNullException("o");

        status = Convert.ToByte(o);
    }

    return status;
}

cmd.ExecuteScalar();null を返すこともできますが、Convert.ToByte(o);0 を返します。

cmd.ExecuteScalar();探している値はデータベース上にある必要があるため、 null を返す場合はエラーです。その値がデータベースにない場合はエラーです。

ここで何をしますか?null を返すか、例外をスローしますか?

4

4 に答える 4

8

あなたは自分の質問にほとんど答えています:

私が探している値はデータベースにある必要があるためです。その値がデータベースにない場合はエラーです。

その値がないとプログラムが機能しない場合は、例外をスローする必要があります。そうでない場合は、null を返して、ライブラリのユーザーに次に何をすべきかを決定させることができます。

于 2014-05-22T12:48:14.450 に答える
1

cmd.ExecuteScalar() が null を返す場合に何かをしたい場合は、null を返す必要があると思います。しかし、あなたが言ったように

探している値はデータベースにある必要があります。その値がデータベースにない場合はエラーです。

ArgumentNullExceptionではなくInvalidOperationExceptionの例外タイプをスローする必要があります。

于 2014-05-22T12:56:01.663 に答える
0

ここhttp://msdn.microsoft.com/en-us/library/ms229009(v=vs.110).aspxおよびここhttp://msdn.microsoft.com/en-us/library/ms229030(v )によると=vs.110).aspx例外は非常にコストがかかるため、注意して使用する必要があります。

確かに return を使用Convert.ToByte(o)して、呼び出し元の関数でテストします。

于 2014-05-22T12:55:55.117 に答える
0

その値がデータベースにない場合はエラーです。

「システムの状態に関する私の信念体系が破られた」または「入力が何らかの形で無効に違いない」というエラーですか? 前者のように聞こえるので、例外をスローします。この場合、発信者は合理的に続行できないようです。できるなら話は別ですが。

実際にはこのオブジェクトの無効な状態ではないことを考えると、を使用InvalidOperationExceptionしたり、独自の例外 (InvalidDatabaseStateExceptionたとえば) を作成したりすることができます。

于 2014-05-22T12:49:26.157 に答える