有更好/更清洁的方法吗?
int stockvalue = 0;
if (!Convert.IsDBNull(reader["StockValue"]))
stockvalue = (int)reader["StockValue"];
答案 0 :(得分:58)
最短(恕我直言)是:
int stockvalue = (reader["StockValue"] as int?) ?? 0;
说明:
答案 1 :(得分:28)
我处理这个的方式是
int? stockvalue = reader["StockValue"] as int?;
非常简单,干净且一条线。如果由于某种原因我绝对不能有一个空值(我发现通常不好推理,因为我宁愿知道一个值是否有意义,或者它是否为一个原始类型的单元化)我会这样做:
int stockvalue = (reader["StockValue"] as int?).GetValueOrDefault(-1);
答案 2 :(得分:11)
几天前我写了一个扩展方法。通过使用它你可以做:
int? stockvalue = reader.GetValue<int?>("StockValue");
这是扩展方法(根据您的需要进行修改):
public static class ReaderHelper
{
public static bool IsNullableType(Type valueType)
{
return (valueType.IsGenericType &&
valueType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)));
}
public static T GetValue<T>(this IDataReader reader, string columnName)
{
object value = reader[columnName];
Type valueType = typeof(T);
if (value != DBNull.Value)
{
if (!IsNullableType(valueType))
{
return (T)Convert.ChangeType(value, valueType);
}
else
{
NullableConverter nc = new NullableConverter(valueType);
return (T)Convert.ChangeType(value, nc.UnderlyingType);
}
}
return default(T);
}
}
答案 3 :(得分:10)
int? stockvalue = (int?)(!Convert.IsDBNull(result) ? result : null);
一种可能的解决方案,以确保DBNull能够承载您的代码。对于我们的小组,作为最佳实践,我们尝试不允许数据库中的NULL列,除非确实需要它。编码处理它有更多的开销,有时只是重新思考问题使得它不是必需的。
答案 4 :(得分:6)
是的,您可以使用int?
这样您可以使用默认值null而不是0.由于stockvalue的结果可能为0,因此不会混淆数据库是0还是null。例如像这样(可以为空)我们有一个默认的初始化-1来表示没有赋值。就个人而言,我认为这有点危险,因为如果您忘记将其设置为-1,则存在数据损坏问题,实际上很难追查。
http://msdn.microsoft.com/en-us/library/2cf62fcy(VS.80).aspx
int? stockvalue = null;
if (!Convert.IsDBNull(reader["StockValue"]))
stockvalue = (int)reader["StockValue"];
//Then you can check
if(stockValue.HasValue)
{
// do something here.
}
答案 5 :(得分:6)
虽然引用reader["StockValue"]
很方便,但效率不高。它也不是强类型的,因为它返回类型object
。
相反,在您的代码中,执行以下操作:
int stockValueOrdinal = reader.GetOrdinal("StockValue");
int? stockValue = reader.IsDbNull(stockValueOrdinal) ?
null :
reader.GetInt32(stockValueOrdinal);
当然,最好一次获得所有的序数,然后在整个代码中使用它们。
答案 6 :(得分:3)
int stockvalue = reader["StockValue"] != DbNull.Value ? Convert.ToInt32(reader["StockValue"]) : 0;
答案 7 :(得分:1)
这是一种方式。
int stockvalue = Convert.IsDbNull(reader["StockValue"]) ? 0 : (int)reader["StockValue"];
您也可以使用TryParse
int stockvalue = 0
Int32.TryParse(reader["StockValue"].ToString(), out stockvalue);
让我们知道哪种方式适合您
答案 8 :(得分:1)
您可以直接在数据库查询中执行此转换,从而完全避免特殊情况。
但我不会称之为“更干净”,除非您可以在代码中始终使用该表单,因为您会通过从数据库返回“0”而不是NULL来丢失信息。
答案 9 :(得分:0)
使用Nullable<int>
类型... int?
简称
答案 10 :(得分:0)
不是真的。您可以将其封装在方法中:
public int getDBIntValue(object value, int defaultValue) {
if (!Convert.IsDBNull(value)) {
return (int)value;
}
else {
return defaultValue;
}
并称之为:
stockVaue = getDBIntVaue(reader["StockValue"], 0);
或者您可以在查询中使用coalesce
来强制返回的值为非null。
编辑 - 根据收到的评论更正了哑码错误。
答案 11 :(得分:0)
我的项目中有两个以下扩展方法:
public static T GetValueSafe<T>(this IDataReader dataReader, string columnName, Func<IDataReader, int, T> valueExtractor)
where T : class
{
T value;
if (dataReader.TryGetValueSafe(columnName, valueExtractor, out value))
{
return value;
}
return null;
}
public static bool TryGetValueSafe<T>(this IDataReader dataReader, string columnName, Func<IDataReader, int, T> valueExtractor, out T value)
{
int ordinal = dataReader.GetOrdinal(columnName);
if (!dataReader.IsDBNull(ordinal))
{
// Get value.
value = valueExtractor.Invoke(dataReader, ordinal);
return true;
}
value = default(T);
return false;
}
用法可以是这样的:
string companyName = dataReader.GetValueSafe("CompanyName", (reader, ordinal) => reader.GetString(ordinal));
答案 12 :(得分:0)
int? stockValue = reader["StockValue"] == null || reader["StockValue"] == DBNull.Value ? null : (int?)reader["StockValue"];