Laden...

SqlDataReader Objekt als DataSource eines DataGridViews

Erstellt von Doltsche vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.831 Views
D
Doltsche Themenstarter:in
249 Beiträge seit 2009
vor 13 Jahren
SqlDataReader Objekt als DataSource eines DataGridViews

verwendetes Datenbanksystem: SQL Server 2005

Hallo

Ich möchte aus einer Datenbank mehrere Zeilen abfragen und diese anschliessend in einem DataGridView anzeigen lassen wobei die Abfrage problemlos verläuft. Das Problem gestaltet sich bei mir auf Seite der Darstellung der Abfrageergebnisse im DataGridView.

Meine Konstruktion entspricht folgendem Codebeispiel:


SqlConnection con = new SqlConnection("..."); 
    
string strSQL = "SELECT ProductName, Unitprice " +                     
                       "FROM Products " +                     
                       "ORDER BY[UnitPrice]";     

SqlCommand cmd = new SqlCommand(strSQL, con);      

// Verbindung öffnen     
con.Open();     

// Query absetzen
SqlDataReader dr = cmd.ExecuteReader(); 

this.myDataGridView.DataSource = dr;

Nur leider wird mir im DataGridView nichts angezeigt.
Wo könnte der Fehler liegen?

LG Samuel

C
2.121 Beiträge seit 2010
vor 13 Jahren

Du solltest eine DataTable zuweisen, oder ein DataSet. Ein Reader ist zum selber auslesen gedacht, ich glaube nicht dass ein Grid das macht, wenn man einen Reader als DataSource einhängt.

J
3.331 Beiträge seit 2006
vor 13 Jahren

ich glaube nicht dass ein Grid das macht, wenn man einen Reader als DataSource einhängt.

Auch dafür hilft ein Blick in :rtfm: DataGridView.DataSource ist zwar als object deklariert, aber aus den Beschreibungen geht hervor, dass der Typ zu einem der folgenden Interfaces passen muss:*The **IList **interface, including one-dimensional arrays. *The **IListSource **interface, such as the DataTable and DataSet classes. *The **IBindingList **interface, such as the BindingList<(Of <(T>)>) class. *The **IBindingListView **interface, such as the BindingSource class.

Damit und mit dem Hinweis von chilic ist klar, dass der DbDataReader das nicht leisten kann: Der ist etwas, was "abläuft", als Liste wird etwas Fertiges, Statisches benötigt.

@Doltsche
Lösung 1: Es wird eine geeignete Liste erzeugt und beim Auslesen des DbDataReaders manuell mit Inhalt gefüllt.
Lösung 2: Mit einer Methode wird das Ergebnis des DbDataReaders direkt in eine DataTable gepackt. Es gibt eine solche Methode, ich vergesse aber immer wieder, wie sie heißt. Also die Suche bemühen...
Lösung 3: Erstelle eine **DataTable **und benutze zum Abholen der Daten DbDataAdapter.Fill(thisTable).

Gruß Jürgen

D
Doltsche Themenstarter:in
249 Beiträge seit 2009
vor 13 Jahren

Hallo

Vielen Dank für die beiden Antworten.
Ich versuchte nun mit der Methode GetString den SqlDataReader auszulesen, steis jedoch auf einen Fehler der mich etwas stutzig werden lies:


string row = string.Empty;

while (reader.Read())
{
    row += reader.GetString(0);
    // Das Objekt des Typs "System.Int32" kann nicht in Typ "System.String" 
    // umgewandelt werden.
}

Ich bin insofern von dieser Meldung überrascht weil der Rückgabewert von GetString ein String ist.
Selbst mit einem zusätzlichen Casting über die Methode ToString() erhalte ich diese Fehlermeldung.

Wie kommt dieser Fehler zustande?

LG Samuel

V
162 Beiträge seit 2010
vor 13 Jahren

Beim Order BY

 .. "ORDER BY[UnitPrice]";
 

muss ein Leerzeichen zwischen BY und [

...  "ORDER BY [UnitPrice]";
 

Das Leben ist schön!

D
Doltsche Themenstarter:in
249 Beiträge seit 2009
vor 13 Jahren

Zwar danke für die Antwort, der Fehler liegt allerdings nicht an der Abfrage. Bei der hier geposteten Abfrage handelt es sich lediglich um ein Beispiel.
Die richtige Abfrage ist etwas Umfangreicher und sollte eigentlich funktionieren. Den beim Ausführen der Abfrage tritt kein Fehler auf. Ausserdem funktioniert sich auch im SQL Server 2005 fehlerfrei.
Der Fehler muss also woanders liegen, fragt sich aber wo?

1.564 Beiträge seit 2007
vor 13 Jahren

Hallo Doltsche

Wie chilic und juetho bereits geschrieben haben kannst du einen DataReader nicht an ein Grid binden. Hierfür musst du ein DataSet, eine DataTable oder eine BindingList<T> verwenden.

Dein Fehler sagt, dass hier schlicht was nicht zusammenpasst. Entweder ist die Spalte ProductName eine INT Spalte oder du verwendest ein anderes Statement.

Lass dir mal mit folgendem Code den Namen der Spalte 0 ausgeben:


MessageBox.Show(reader.GetName(0));

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.