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
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.
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).
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)
Sie auch in IDataReader.GetSchemaTable
verwenden können, um eine Liste aller Spalten der Leser.
Die GetSchemaTable listet die Spalten der zurückgegebenen Datenstruktur nicht auf. – JamesEggers
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. –
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
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.
Enumerable.Range(0, reader.FieldCount).Any(i => reader.GetName(i) == "ColumnName")
- 1. Überprüfen, ob ein Array ein bestimmtes Objekt enthält
- 2. Wie überprüft man, ob ein String ein bestimmtes Zeichen enthält?
- 3. Überprüfen, ob ein Array ein bestimmtes Objekt (iOS) enthält
- 4. überprüfen, ob ein std :: vector ein bestimmtes Objekt enthält?
- 5. Überprüfen, ob ein Element ein bestimmtes Kindelement enthält
- 6. Woher weiß man, ob ein UITextField ein bestimmtes Zeichen enthält?
- 7. Erkennen, ob ein bestimmtes Sprite berührt wurde Cocos2d-iphone
- 8. RegEx, um festzustellen, ob eine Zeichenfolge ein bestimmtes Zeichen enthält
- 9. Prüfen, ob ein Array kein bestimmtes Objekt enthält
- 10. erkennen, ob Bespannbild enthält
- 11. Überprüfen Sie die Datenbank, ob ein bestimmtes Feld bereits existiert
- 12. Wie überprüft man, ob ein bestimmtes Feld einen Fehler in Django enthält?
- 13. Wie erkennt man am besten, ob ein IDataReader leer ist?
- 14. jQuery überprüfen, ob ein bestimmtes Optionsfeld
- 15. Erkennen, ob Sammlung Daten enthält
- 16. Erkennen, ob ein Cordova-Plugin existiert
- 17. Fokus auf ein bestimmtes Feld verschieben
- 18. Zweig: Zugriff auf ein bestimmtes Array-Feld
- 19. Erkennen, ob ein HttpModule geladen ist
- 20. In .NET, wie kann ich erkennen, ob ein Benutzer ein bestimmtes Redistributable installiert hat?
- 21. Prüfen, ob eine Scheitelpunktliste ein Objekt enthält
- 22. Wie kann ich in Java feststellen, ob ein Char-Array ein bestimmtes Zeichen enthält?
- 23. Prüfen, ob ein Bootstrap-Tooltip einem Feld zugeordnet ist?
- 24. Wie kann festgestellt werden, ob ein NSSet Berührungen für ein bestimmtes Steuerelement enthält?
- 25. Ermitteln, ob ein Java.awt.Rectangle enthält eine Java.awt.Color
- 26. fest, ob ein bestimmtes Fenster wird derzeit
- 27. Wie kann ein bestimmtes Feld innerhalb der Gridview erweitert werden?
- 28. So lesen Sie ein Bild von IDataReader
- 29. Verfolgen, ob ein Benutzer ein bestimmtes "Wort" in einem WinForm
- 30. Wie erkennt man, ob ein bestimmtes Laufwerk eine Festplatte ist?
Das funktioniert schlecht – DalSoft