2008-09-09 3 views
8

Also verwende ich einen IDataReader, um einige Geschäftsobjekte zu hydratisieren, aber ich weiß zur Laufzeit nicht genau, welche Felder im Leser sein werden. Alle Felder, die nicht im Reader enthalten sind, würden für das resultierende Objekt null bleiben. Wie testen Sie, ob ein Reader ein bestimmtes Feld enthält, ohne es nur in einen try/catch zu legen?Erkennen, ob ein IDataReader ein bestimmtes Feld vor der Iteration enthält

Antwort

-4

Sie können Reader ["field"] nicht nur auf null oder DBNull testen, da eine IndexOutOfRangeException ausgelöst wird, wenn sich die Spalte nicht im Reader befindet.

Der Code, den ich in meiner Mapping-Schicht zum Erstellen von Domänenobjekten und die gespeicherten Prozeduren verwenden, die den Mapping-Layer verwenden, hat möglicherweise andere Spaltennamen darunter; Sie können es so ändern, dass keine Ausnahme ausgelöst wird, wenn die Spalte nicht gefunden wird, und default (t) oder null zurückgegeben wird.

Ich verstehe, dies ist nicht die eleganteste oder optimale Lösung (und wirklich, wenn Sie es vermeiden können, dann sollten Sie), jedoch ältere Stored Procedures oder Sql-Abfragen möglicherweise eine Umgehung rechtfertigen.

+1

Das funktioniert schlecht – DalSoft

-3

Während ich mit diesem Ansatz nicht einverstanden bin (ich denke beim Zugriff auf Daten, sollten Sie die Form vor der Hand kennen), verstehe ich, dass es Ausnahmen gibt.

Sie könnten immer eine Datentabelle mit dem Leser laden und dann durchlaufen. Sie können dann prüfen, ob die Spalte existiert. Dies wird weniger performant sein, aber Sie werden keine try/catch-Blöcke benötigen (vielleicht ist es also leistungsfähiger für Ihre Bedürfnisse).

9

Diese den Trick tun sollten:

Public Shared Function ReaderContainsColumn(ByVal reader As IDataReader, ByVal name As String) As Boolean 
     For i As Integer = 0 To reader.FieldCount - 1 
      If reader.GetName(i).Equals(name, StringComparison.CurrentCultureIgnoreCase) Then Return True 
     Next 
     Return False 
    End Function 

oder (in C#)

public static bool ReaderContainsColumn(IDataReader reader, string name) 
{ 
    for (int i = 0; i < reader.FieldCount; i++) { 
     if (reader.GetName(i).Equals(name, StringComparison.CurrentCultureIgnoreCase)) return true; 
    } 
    return false; 
} 

: o)

7

Sie auch in IDataReader.GetSchemaTable verwenden können, um eine Liste aller Spalten der Leser.

http://support.microsoft.com/kb/310107

+0

Die GetSchemaTable listet die Spalten der zurückgegebenen Datenstruktur nicht auf. – JamesEggers

+2

Ja, tut es. Das erste Element in jeder Zeile von reader.GetSchemaTable(). Zeilen sind die Spaltennamen. d. h. reader.GetSchemaTable(). Zeilen [0] [0] gibt mir den ersten Spaltennamen. –

+0

Als ich das letzte Mal versucht habe, gab es mir die schema_info wie Spalten. Ich muss es noch einmal versuchen, da es schon eine Weile her ist. – JamesEggers

0

Die beste Lösung, die ich verwendet habe, ist es, wie dies zu tun:

DataTable dataTable = new DataTable(); 
dataTable.Load(reader); 
foreach (var item in dataTable.Rows) 
{ 
    bool columnExists = item.Table.Columns.Contains("ColumnName"); 
} 

es durch Leser zuzugreifen versuchen, [ „Spaltenname“] und Überprüfung auf null oder DBNull wird werfen eine Ausnahme.

4
Enumerable.Range(0, reader.FieldCount).Any(i => reader.GetName(i) == "ColumnName") 
Verwandte Themen