Gibt es einen besseren Weg, um den Wert field_name von einem IDataRecord nur zu bekommen, wenn der field_name im IDataRecord existiert, verwende ich momentan einen try {...} catch {...} blockieren, aber dies ist eine Art von On Error Resume next . Einige Alternativen?
%Vor%Ich habe meine ValueIfExists -Funktion so geändert, dass sie Ihre Ideen widerspiegelt. Daher sieht das so aus:
%Vor%Sie haben Recht, dass Ausnahmen nicht für den normalen Programmablauf verwendet werden sollten.
Die GetOrdinal
-Methode ist für Situationen gedacht, in denen Sie wissen, welche Felder Sie erhalten, und wenn ein Feld fehlt, ist dies ein Fehler, der zu einer Ausnahme führen sollte.
Wenn Sie nicht wissen, welche Felder Sie im Ergebnis erhalten, sollten Sie die Methode GetOrdinal
vermeiden. Sie können stattdessen alle Namen und ihren Index in ein Wörterbuch aufnehmen, das Sie als Ersatz für die Methode GetOrdinal
verwenden können:
Sie können die Methode ContainsKey
verwenden, um zu überprüfen, ob der Name im Wörterbuch vorhanden ist, oder die Methode TryGetValue
, um zu überprüfen, ob der Name existiert und seinen Index in einem einzigen Vorgang abzurufen.
Die Methode GetOrdinal
führt zuerst eine Suche nach dem Namen durch, in der die Groß- und Kleinschreibung berücksichtigt wird, und wenn dies fehlschlägt, führt sie eine Suche in Groß- und Kleinschreibung durch. Das ist nicht im Dictionary vorgesehen. Wenn Sie also genau dieses Verhalten wollen, würden Sie die Namen lieber in einem Array speichern und eine Methode schreiben, um sie zu durchlaufen, wenn Sie den Index finden wollen.
Sehen Sie sich diese eng verwandte Frage an, um einen brauchbaren Ansatz für das Testen der Existenz eines Feldes zu finden. Beachten Sie, dass es bei einer Iteration einer Sammlung von Ergebnissen wahrscheinlich besser ist, die Spalte einmal und nicht bei jeder Iteration zu überprüfen.
Ich verwende immer den folgenden Ansatz für IDataReader
(da die meisten IDataRecord
Leser sind)
reader.GetSchemaTable().Columns.Contains("field")
Natürlich, wenn du ein echtes IDataRecord
hast, scheitert das, wenn du versuchst, es in IDataReader
zu werfen und es ist keins.