2016-04-07 8 views
0

Ich versuche, Werte von einem System.Data.Odbc.OdbcDataReader zu lesen. Das Problem ist, dass es einfach nicht funktioniert. Wenn ich versuche, einen Wert von einer vorhandenen Spalte (Feld) zu erhalten, löst es eine Ausnahme aus. In meinem cae, FieldCount ist 8, aber zum Beispiel, wenn ich lese.IsDBNull (4) aufrufen, es wirft.IDbReader wirft Ausnahmen für vorhandene Spalten

Für Werte Spalte ID von 0 bis 2, ruft es den richtigen Wert ab. Aber Leser [3] zu Leser [7], eine Ausnahme wird ohne Information darüber, was passiert ist, geworfen.

Noch schlimmer, dieser Code (GetName) löst auch die gleiche Ausnahme aus!

for (int ordinal = 0; ordinal < reader.FieldCount; ordinal++) 
{ 
    Console.WriteLine("Field {0}: {1}", ordinal, reader.GetName(ordinal)); 
} 

Dies ist die Ausnahme, die ausgelöst wird, wenn ich den Wert für eine bestehende Spalte erhalten:

in 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.Odb cDataReader.IsDBNull (Int32 i) in AisgeXmlVrdb.LogicaNegocio.MappingExtensions.SafeGetString (IDataRecord Leser, Int32 colIndex) in AisgeXmlVrdb.LogicaNegocio.MetodosComunes.ObtenerSolicitudesExportacionTodas()

Ich verstehe nicht, was unter dem geschieht Kapuze.

Nur um ein bisschen mehr Informationen hinzuzufügen, ist der ODBC-Treiber, den ich benutze, Apple File Maker.

Was noch seltsamer ist, dass Überprüfung reader[4], reader[5], ... auch wirft.

Könnte es sein, dass der ODBC-Treiber etwas nicht unterstützt?

Antwort

0

Wenn von „nicht vorhanden ist“ Sie bedeuten überschreitet Fieldcount dann das ist das erwartete Verhalten für alle IDataRecord implementions als geskilled in MSDN

Wenn Sie den ungültigen Index Fall string.Empty auf Standard wollen:

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; 
} 
+0

Bitte überprüfen Sie die Korrektur. Ich machte einen Fehler. FieldCount ist 8 und die Abfrage umfasst genau 8 Felder, aber Leser [4] zum Beispiel löst eine Ausnahme aus. – SuperJMN

0

Ich weiß nicht, was Sie erwarten sollten, wenn der Spaltenindex größer als die Gesamtzahl der Spalten in Daten ist. Es sollte eine Ausnahme geben.

Ansonsten können Sie Ihren Code verkürzen, um Convert.ToString zu verwenden, statt explizit auf DBNull.Value zu überprüfen. Convert.ToString wird leere Zeichenfolge im Fall DBNull.Value zurückgeben, das ist, was Sie in Ihrer Methode tun. So könnte Ihre Methode:

public static string SafeGetString(this IDataRecord reader, int colIndex) 
{ 
    return Convert.ToString(reader[colIndex]); 
} 

Wenn aus irgendeinem Grund Sie leere Zeichenfolge zurückgeben möchten, wenn die Spalte Index aus gebunden ist, dann können Sie explizit gegen FieldCount Feld überprüfen und einen leeren String zurück, aber dies sollte vermieden werden MEINER BESCHEIDENEN MEINUNG NACH.

public static string SafeGetString(this IDataRecord reader, int colIndex) 
{ 
    if (colIndex >= 0 && colIndex < reader.FieldCount) 
    { 
     return Convert.ToString(reader[colIndex]); 
    } 
    else 
    { 
     return ""; 

    } 
} 

Aber ich würde versuchen, den oben beschriebenen Ansatz zu vermeiden, da es das Standardverhalten verbirgt und ändern und könnte einen Fehler am Ende zu verursachen, die schwer zu verfolgen.

+0

Bitte überprüfen Sie die Korrektur. Ich machte einen Fehler. FieldCount ist 8 und die Abfrage umfasst genau 8 Felder, aber Leser [4] zum Beispiel löst eine Ausnahme aus. – SuperJMN