我想将从数据库中读取的值设置为字符串(使用 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 可以解决我的问题,但是在捕获到异常后尝试阻止了。
提前谢谢。
答案 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));
}