我试图从System.Data.Odbc.OdbcDataReader中读取值。问题在于它根本不起作用。当我尝试从现有列(字段)中获取值时,它会抛出异常。在我的cae中, FieldCount是8 ,但是,例如,如果我调用reader.IsDBNull(4),它会抛出。
对于值0到2的值列,它将检索正确的值。但读者[3]对读者[7],抛出了一个例外,没有发生的事情的信息。
更糟糕的是,此代码(GetName)也会抛出相同的异常!
for (int ordinal = 0; ordinal < reader.FieldCount; ordinal++)
{
Console.WriteLine("Field {0}: {1}", ordinal, reader.GetName(ordinal));
}
这是我获取现有列的值时抛出的异常:
System.Data.Odbc.OdbcConnection.HandleError中的(OdbcHandle hrHandle, RetCode retcode)in System.Data.Odbc.OdbcDataReader.GetColAttribute(Int32 iColumn, SQL_DESC v3FieldId,SQL_COLUMN v2FieldId,HANDLER handler)in System.Data.Odbc.OdbcDataReader.GetSqlType(Int32 i)in System.Data.Odbc.OdbcDataReader.GetValue(Int32 i)in System.Data.Odbc.OdbcDataReader.IsDBNull(Int32 i)in AisgeXmlVrdb.LogicaNegocio.MappingExtensions.SafeGetString(IDataRecord 读者,Int32 colIndex)in AisgeXmlVrdb.LogicaNegocio.MetodosComunes.ObtenerSolicitudesExportacionTodas()
我不明白引擎盖下发生了什么。
为了添加更多信息,我使用的ODBC驱动程序是Apple的File Maker。
更奇怪的是,检查reader[4]
,reader[5]
,reader[6]
...也会被抛出。
可能是ODBC驱动程序不支持某些内容吗?
答案 0 :(得分:0)
如果“不存在”意味着超出FieldCount那么这就是MSDN
中规定的所有IDataRecord实现的预期行为如果要将无效索引案例默认为string.Empty:
public static string SafeGetString(this IDataRecord reader, int colIndex)
{
if (((colIndex >= 0) && (colIndex < reader.FieldCount)) &&
!reader.IsDBNull(colIndex))
{
return reader.GetString(colIndex);
}
return string.Empty;
}
答案 1 :(得分:0)
如果列索引大于数据中的总列数,我不知道您应该期待什么。应该有一个例外。
除此之外,您可以缩短代码以使用Convert.ToString
,而不是明确检查DBNull.Value
。如果Convert.ToString
,DBNull.Value
将返回空字符串,这就是您在方法中所做的事情。所以你的方法可能是:
public static string SafeGetString(this IDataRecord reader, int colIndex)
{
return Convert.ToString(reader[colIndex]);
}
如果由于某种原因你希望在列索引超出范围时返回空字符串,那么你可以显式检查FieldCount
字段并返回一个空字符串,但这应该避免恕我直言。
public static string SafeGetString(this IDataRecord reader, int colIndex)
{
if (colIndex >= 0 && colIndex < reader.FieldCount)
{
return Convert.ToString(reader[colIndex]);
}
else
{
return "";
}
}
但我会尽量避免上述方法,因为它会隐藏并修改默认行为,最终可能会导致难以跟踪的错误。