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