Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-don';Don’不要打破一个绊脚石_C#_.net_Try Catch - Fatal编程技术网

C#-don';Don’不要打破一个绊脚石

C#-don';Don’不要打破一个绊脚石,c#,.net,try-catch,C#,.net,Try Catch,我想将从数据库读取的值设置为字符串(使用SqlDataReader)。我有一个try catch块来捕获一些可能来自数据库表的System.DBNull。每当这些空值出现时,我想为该字段设置一个不同的值。然后将这些字段设置为对象,然后添加到列表中 以下代码更好地说明了我的问题: while(reader.Read()) { 尝试 { 字符串originalfilename=(字符串)读取器[0]; 字符串重命名文件名=(字符串)读取器[1]; 字符串表=(字符串)读取器[2]; 字符串版本=(字

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

以下代码更好地说明了我的问题:

while(reader.Read())
{
尝试
{
字符串originalfilename=(字符串)读取器[0];
字符串重命名文件名=(字符串)读取器[1];
字符串表=(字符串)读取器[2];
字符串版本=(字符串)读取器[3];
AddDocument(原始文件名、重命名文件名、工作表、版本);
}
捕获(无效卡斯特例外e)
{
e、 Source=“不适用”;
}
}
在本例中,如果读卡器[2]为System.DBNull,则我希望工作表字符串具有“N/A”,但我希望版本读卡器[3]正常设置,并在之后执行AddDocument

我正在寻找一个没有很多if的解决方案。我原以为e.Source可以解决我的问题,但异常被捕获后,try块中断


提前感谢。

对于正常的工作流程,不要使用
try catch
,而应该使用


对于正常的工作流程,不要使用
try catch
,而应该使用

我认为这是最直接的方法

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())
{
    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);
}
安全(简单)


您不应该使用这样的异常,异常是针对异常情况的。如果参数为DbNull,则必须定义一个返回默认值的方法:

private T GetValueOrDefault<T>(object val, T defaultValue)
{
    if(val == DBNull.Value)
        return defaultValue;
    return (T)val;
}
private T GetValueOrDefault(对象值,T defaultValue)
{
if(val==DBNull.Value)
返回默认值;
返回(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);
}
while(reader.Read())
{
字符串originalfilename=GetValueOrDefault(读取器[0],“不适用”);
字符串重命名文件名=GetValueOrDefault(读取器[1],“不适用”);
字符串表=GetValuerDefault(读取器[2],“不适用”);
字符串版本=GetValuerDefault(读取器[3],“不适用”);
AddDocument(原始文件名、重命名文件名、工作表、版本);
}

您不应该使用这样的异常,异常是针对异常情况的。如果参数为DbNull,则必须定义一个返回默认值的方法:

private T GetValueOrDefault<T>(object val, T defaultValue)
{
    if(val == DBNull.Value)
        return defaultValue;
    return (T)val;
}
private T GetValueOrDefault(对象值,T defaultValue)
{
if(val==DBNull.Value)
返回默认值;
返回(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);
}
while(reader.Read())
{
字符串originalfilename=GetValueOrDefault(读取器[0],“不适用”);
字符串重命名文件名=GetValueOrDefault(读取器[1],“不适用”);
字符串表=GetValuerDefault(读取器[2],“不适用”);
字符串版本=GetValuerDefault(读取器[3],“不适用”);
AddDocument(原始文件名、重命名文件名、工作表、版本);
}
简单方法:

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)));
        }
    }
公共静态类DataReaderExtensions
{
公共静态T读(这个SqlDataReader读卡器,int索引,T defaultValue=default(T))
{
var值=读取器[索引];
返回(T)((DBNull.Value.Equals(Value))
?默认值
:Convert.ChangeType(value,typeof(T));
}
}
然后像这样使用它:

while(myDataReader.Read())
{
  string sheet = myDataReader.Read<string>(2, "n/a");
}
while(myDataReader.Read())
{
字符串表=myDataReader.Read(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)));
        }
    }
公共静态类DataReaderExtensions
{
公共静态T读(这个SqlDataReader读卡器,int索引,T defaultValue=default(T))
{
var值=读取器[索引];
返回(T)((DBNull.Value.Equals(Value))
?默认值
:Convert.ChangeType(value,typeof(T));
}
}
然后像这样使用它:

while(myDataReader.Read())
{
  string sheet = myDataReader.Read<string>(2, "n/a");
}
while(myDataReader.Read())
{
字符串表=myDataReader.Read(2,“不适用”);
}

只有当您正在处理的案例是一个异常时,才应该使用异常,这是您“现在”无法真正处理的。您应该使用
if
s或三元表达式。您确定应该使用try/catch块吗?听起来这不一定是异常行为。每个字段需要一个try/catch。使用
if(…!=DbNull)
在各个方面都要好得多。。。为每个字段设置
if
比为每个字段设置
try/catch
更容易field@Mephy正确,这是一个教训,如果我想要程序的正常工作流程,就要避免使用异常,就像另一个答案中指出的那样。只有当您处理的案例是异常时,才应该使用异常,“现在”你不能真正处理的事情。您应该使用
if
s或三元表达式。您确定应该使用try/catch块吗?听起来这不一定是异常行为。每个字段需要一个try/catch。使用
if(…!=DbNull)
在各个方面都要好得多。。。为每个字段设置
if
比为每个字段设置
try/catch
更容易field@Mephy正确,这是一个教训,如果我想要一个正常的程序工作流程,就像在另一个答案中指出的那样,避免使用异常。在这种情况下没有
e
。您可能是指
stringsheet=reader.IsDBNUll(2)?“不适用”:reader.GetString(2)看看他的挡块。它将捕获的异常声明为
e
。在
try
scope.IsDBNull中没有
e
,它确实很有用,但是我想要的不仅仅是工作表字段,而是通用的。我有15个字段,需要一种方法来知道哪个是w