Erkennen, ob ein IDataReader ein bestimmtes Feld vor der Iteration enthält [duplizieren]

8

Ich verwende also 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 spezifisches Feld enthält, ohne es nur in einen try / catch einzubinden?

    
JC Grubbs 09.09.2008, 21:25
quelle

6 Antworten

9

Dies sollte den Trick machen:

%Vor%

oder (in C #)

%Vor%

: o)

    
mrrrk 13.08.2009 13:12
quelle
7

Sie können auch IDataReader.GetSchemaTable verwenden, um eine Liste aller Spalten im Reader zu erhalten.

Ссылка

    
Tadmas 13.08.2009 13:25
quelle
4
%Vor%     
Clement 13.03.2014 01:10
quelle
0

Die beste Lösung, die ich verwendet habe, ist es so:

%Vor%

Wenn Sie versuchen, über reader ["ColumnName"] darauf zuzugreifen und nach Null oder DBNull zu suchen, wird eine Ausnahme ausgelöst.

    
Seb Nilsson 13.08.2009 13:29
quelle
-3

Obwohl 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 Reader 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 besser für Ihre Bedürfnisse).

    
Craig Wilson 18.11.2008 19:08
quelle
-4

Sie können Reader ["field"] nicht einfach 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 verwende, und die gespeicherten Prozeduren, die die Mapping-Schicht verwenden, haben 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, dass dies nicht die eleganteste oder optimale Lösung ist (und wirklich, wenn Sie es vermeiden können, dann sollten Sie es tun), jedoch könnten gespeicherte Stored Procedures oder Sql-Abfragen einen Workaround rechtfertigen.

%Vor%     
adparadox 18.11.2008 19:03
quelle

Tags und Links