ADO.Net: Überprüfen Sie, ob der Feldname auf IDataRecord existiert

7

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%     
ArBR 08.11.2010, 17:40
quelle

4 Antworten

16

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:

%Vor%

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.

    
Guffa 08.11.2010, 17:52
quelle
2

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.

Prüfe auf den Spaltennamen in einem SqlDataReader-Objekt

    
kbrimington 08.11.2010 17:49
quelle
2

Mit einer Zeile:

%Vor%     
Lukasz Pyrzyk 21.09.2016 13:48
quelle
1

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.

    
Michael B 09.11.2010 13:37
quelle

Tags und Links