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

你几乎在回答你自己的问题:

因为我要查找的值必须在 database 上。如果该值不在数据库中,则为错误。

如果您的程序在没有该值的情况下无法运行,您应该抛出异常,如果不是,您可以返回 null 并让库的用户决定下一步该做什么。

于 2014-05-22T12:48:14.450 回答
1

我认为如果你想在 cmd.ExecuteScalar() 返回 null 时做某事,那么你应该返回一个 null。但正如你所说

我要查找的值必须在数据库中。如果该值不在数据库中,则为错误。

那么你应该抛出一个异常类型InvalidOperationException而不是ArgumentNullException

于 2014-05-22T12:56:01.663 回答
0

如果该值不在数据库中,则为错误。

“我对系统状态的信念系统已被违反”或“输入必须以某种方式无效”方面的错误?听起来更像是前者 - 所以我会抛出一个异常。在这种情况下,听起来调用者无法合理地继续。如果可以,那就另当别论了。

您可能想要使用InvalidOperationException,或者可能创建自己的异常(InvalidDatabaseStateException例如),因为它实际上并不是这个对象的无效状态。

于 2014-05-22T12:49:26.157 回答
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异常非常昂贵,应谨慎使用。

我肯定会使用 returnConvert.ToByte(o)并在调用函数上对其进行测试。

于 2014-05-22T12:55:55.117 回答