IDbReader抛出现有列的异常

时间:2016-04-07 16:51:26

标签: c# .net database odbc filemaker

我试图从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驱动程序不支持某些内容吗?

2 个答案:

答案 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.ToStringDBNull.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 "";

    }
}

但我会尽量避免上述方法,因为它会隐藏并修改默认行为,最终可能会导致难以跟踪的错误。