2016-06-21 7 views
4

Ich versuche, einige Organisationsdaten aus einer Datenbank abzurufen. Ich brauche noch ein paar Daten, aber ich stecke nur an den Organisationsnamen und die Adresse der Organisation. Ich versuche, eine Abfrage auszuführen, die eine Verknüpfung enthält, und ein Objekt zu erstellen, bei dem es sich um eine Liste einer benutzerdefinierten Klasse handelt, die ich erstellt habe. Das Seltsame ist, wenn ich den Code in meiner while-Schleife kommentiere und nur den Namen der Orgs bekomme, funktioniert es, aber sobald ich versuche, eine Liste von Objekten zu erstellen, tut es das nicht. HierSqlDataReader gibt beim Hinzufügen zur Liste nicht alle Zeilen zurück <MyClass>

ist, was ich habe, mit meiner Klasse beginnen:

namespace FFDFrameWorkPart 
{ 
    public class OrgData 
    { 
     public string orgName { get; set; } 
     public string orgAddress { get; set; } 
    } 
} 

List<OrgData> OrgObject = new List<OrgData>(); 
List<string> orgName = new List<string>(); 
    using (SqlConnection connection = new SqlConnection(connectString)) 
    { 
     connection.Open(); 
     SqlCommand GrabOrgsFromDb = new SqlCommand(getConstitData, connection); 
     SqlDataReader reader = GrabOrgsFromDb.ExecuteReader(); 
     try 
     { 
      while (reader.Read()) 
      { 
       orgName.Add(reader.GetString(0)); 
       OrgObject.Add(new OrgData() 
       { 
        orgName = reader.GetString(0), 
        orgAddress = reader.GetString(1) 
       }); 
      } 
     } 
     catch (Exception ex) 
     { 
      consoleLog.Value = ex.ToString(); 
     } 
     finally 
     { 
      reader.Close(); 
     } 
    } 

ausgeführt wird, der Code führt orgName.Count und OrgObject.Count in der Nachbarschaft von 20.

sein, wenn ich einfach auskommentieren

OrgObject.Add(new OrgData() 
{ 
    orgName = reader.GetString(0), 
    orgAddress = reader.GetString(1) 
}); 

Dann springt orgName.Count auf etwa 28.000. Keine andere Änderung am Code ist notwendig, nur kommentieren, wo ich versuche, meine Liste zu bauen, und ich verliere rund 28.000 Datensätze aus meinen Ergebnissen.

EDIT: Es ist ein Nullwert in einem der Felder schlagen und Stoppen

+0

Gibt es ein Problem in der Datenquelle auf Spalte 1 der 21. Reihe Rekord? Es würde dann die Schleife brechen. – ydoow

+0

Da war, danke. – reggieb

Antwort

3

Sie SqlDataReader.IsDBNull zu überprüfen, verwenden könnte, ob die Spalte nicht vorhandene oder fehlende Werte enthält.

OrgObject.Add(new OrgData() 
{ 
    orgName = reader.IsDBNull(0) ? null : reader.GetString(0) , 
    orgAddress = reader.IsDBNull(1) ? null : reader.GetString(1) 
); 
1

Überprüfen Sie, ob die Felder NULL sind und stattdessen hartkodierte ordinals der Verwendung ist es besser GetOrdinal zu verwenden. Auf diese Weise werden die Ordnungszahlen automatisch angepasst, wenn Felder zur Tabelle hinzugefügt werden.

OrgObject.Add(new OrgData() 
{ 
    orgName = reader.IsDBNull(reader.GetOrdinal("Name")) ? null : reader.GetString(reader.GetOrdinal("Name")) , 
    orgAddress = reader.IsDBNull(reader.GetOrdinal("Address")) ? null : reader.GetString(reader.GetOrdinal("Address")) 
); 

oder ein wenig sauberer

int nameOrd = reader.GetOrdinal("Name"); 
int addressOrd = reader.GetOrdinal("Address"); 

    OrgObject.Add(new OrgData() 
    { 
     orgName = reader.IsDBNull(nameOrd) ? null : reader.GetString(nameOrd) , 
     orgAddress = reader.IsDBNull(addressOrd) ? null : reader.GetString(addressOrd)); 
Verwandte Themen