C# - 不要破坏try catch块

时间:2014-09-17 20:40:33

标签: c# .net try-catch

我想将从数据库中读取的值设置为字符串(使用 SqlDataReader )。我有一个 try-catch 块来捕获可能来自数据库表的一些System.DBNull。每当出现 nulls 时,我想为该字段设置不同的值。然后将这些字段设置为对象,然后将其添加到列表中。

以下代码更好地解决了我的问题:

while (reader.Read())
{
    try
    {
        string originalfilename = (string)reader[0];
        string renamedfilename = (string)reader[1];
        string sheet = (string)reader[2];
        string version = (string)reader[3];

        AddDocument(originalfilename, renamedfilename, sheet, version);
    }
    catch (InvalidCastException e)
    {
        e.Source = "N/A";
    }
}

在示例中,如果 reader [2] 是System.DBNull,那么我希望字符串具有" N / A&# 34; ,但我想从 reader [3] 正常设置版本,并在之后执行AddDocument。

我正在寻找一个没有很多的解决方案。我认为 e.Source 可以解决我的问题,但是在捕获到异常后尝试阻止了。

提前谢谢。

4 个答案:

答案 0 :(得分:2)

简单方法:

var sheet = reader[2] as string ?? "N/A"

或使用扩展方法:

    public static class DataReaderExtensions 
    {
        public static T Read<T>(this SqlDataReader reader, int index, T defaultValue = default(T))
        {
            var value = reader[index];

            return (T)((DBNull.Value.Equals(value))
                       ? defaultValue
                       : Convert.ChangeType(value, typeof(T)));
        }
    }

并使用它:

while(myDataReader.Read())
{
  string sheet = myDataReader.Read<string>(2, "n/a");
}

答案 1 :(得分:1)

请勿将try-catch用于正常的工作流程,而应使用reader.IsDBNull:

string originalfilename = reader.GetString(0);
string renamedfilename = reader.GetString(1)
string sheet = null;
if(reader.IsDBNull(2))
    sheet = "N/A";
else
     sheet = reader.GetString(2);
string version = reader.GetString(3)

答案 2 :(得分:1)

您不应该使用这样的例外情况,例外是针对特殊情况。如果参数为DbNull:

,则必须定义一个返回默认值的方法
private T GetValueOrDefault<T>(object val, T defaultValue)
{
    if(val == DBNull.Value)
        return defaultValue;
    return (T)val;
}

然后您可以像这样使用此方法:

while (reader.Read())
{
    string originalfilename = GetValueOrDefault<string>(reader[0], "N/A");
    string renamedfilename = GetValueOrDefault<string>(reader[1], "N/A");
    string sheet = GetValueOrDefault<string>(reader[2], "N/A");
    string version = GetValueOrDefault<string>(reader[3], "N/A");

    AddDocument(originalfilename, renamedfilename, sheet, version);
}

答案 3 :(得分:0)

我认为?: operator是最直接的方法。

while (reader.Read())
{
    string originalfilename = reader.GetString(0);
    string renamedfilename = (string)reader[1];
    string sheet = rdr.IsDBNull(2) ? "N/A" : reader.GetString(2);;
    string version = (string)reader[3];
    AddDocument(originalfilename, renamedfilename, sheet, version);
}

安全(简单)

while (reader.Read())
{
    AddDocument(rdr.IsDBNull(0) ? "N/A" : reader.GetString(0)
               ,rdr.IsDBNull(1) ? "N/A" : reader.GetString(1)
               ,rdr.IsDBNull(2) ? "N/A" : reader.GetString(2)
               ,rdr.IsDBNull(3) ? "N/A" : reader.GetString(3));
}