2016-05-13 11 views
0

Ich lese ein Bit-Wert aus einer SQL-Tabelle zurück und Casting als ein boolescher Wert, um einen booleschen Modellwert zuzuordnen.Wie löst man eine IndexOutOfRangeException auf Bit-Wert auf?

Aber wenn ich das IsPDLChecked Bit-Feld zurückgelesen und als falsch initialisiert habe, bekomme ich eine index out of range exception.

sah ich die Definition von Ausnahme und ich bin mir nicht sicher, warum der Wert außerhalb des Bereichs liegt aufgrund seiner init mit einem falschen Wert, dh 0 zu sein. Es ist also kein negativer Bereichswert.

Frage:

Warum erhalte ich einen IndexOutOfRange exception obwohl der Wert Bit wird zurückgelesen wird gegossen in bool und init auf false?

Code:

Modell -

public partial class EmailContact 
{ 
    public int ContactID { get; set; } 
    public bool IsPDLChecked { get; set; } 
    public string ContactDisplayName { get; set; } 
    public string ContactEmailAddress { get; set; } 

} 

Datenleser Schnipsel -

while (dataReader.Read()) 
{ 
    statusList.Add(new EmailContact(dataReader["IsPDLChecked"] as bool? ?? false,dataReader["ContactDisplayName"].ToString(), dataReader["ContactEmailAddress"].ToString())); 
} 

Fehler Detail:

System.IndexOutOfRangeException wurde
gefangen HResult = -2146233080
Message = IsPDLChecked
Source = System.Data
Stacktrace:

bei System.Data.ProviderBase.FieldNameLookup.GetOrdinal (String fieldname)
bei System .Data.SqlClient.SqlDataReader.GetOrdinal (String name)
bei System.Data.SqlClient.SqlDataReader.get_Item (String name)

DB Schema: (habe ich die "CHARACTER_MAX_LENGTH" -Spalte bemerken wird auf NULL auf diese eingestellt):

enter image description here

DB Werte: (IsPDLChecked einen Wert hat)

enter image description here

Antwort

1

Die documentation sagt, dass die IndexOutOfRangeException, die Sie bekommen, geworfen wird, wenn "der angegebene Name kein gültiger Spaltenname ist".

Das erste, was Sie tun sollen, ist sicher, dass die Spalte Namen in C# Spiel in der Tabelle zu machen (oder in der Abfrage, wenn sie neu definiert werden):

SELECT ContactDisplayName, ContactEmailAddress, IsPDLChecked FROM table 

oder

SELECT * FROM table 

Gibt die Spaltennamen zurück, die denen in der Tabelle entsprechen, und Ihr Leser sollte in Ordnung sein, wie es jetzt ist.

Aber wenn Ihre Abfrage sieht wie folgt aus:

SELECT ContractDisplayName as Name, 
     ContactEmailAddress as Email, 
     IsPDLChecked as Checked 
    FROM table 

Sie das Ergebnis wie folgt in C# lesen müssen:

dataReader["Name"] 
dataReader["Email"] 
dataReader["Checked"] 
Verwandte Themen