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?
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.
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).
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%Tags und Links c#