Announcement

Collapse
No announcement yet.

sql-reader Datensätze in Datatable und an Aufrufer zurückgeben?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • sql-reader Datensätze in Datatable und an Aufrufer zurückgeben?

    Hey,

    ich versuche grad Die Datensätze die mit ich mit einem sqlreader von der DB auslese in eine Datatable zu packen aber das funktioniert einfach nicht. Zudem will ich die Datensätze an die GUI zurückgeben und das läuft natürlich auch nicht ...

    Das sieht derzeit so aus:

    Code:
    int rowCounter = 0;
    
    DataTable entryDataTable = new DataTable();
    
    sql_command.CommandText = "Select * from Kunde;";
    
    try
    {
        sql_connection.Open();
    
        // liefert DataReader zurück
        sql_reader = sql_command.ExecuteReader();
    
        // Die Datensätze aus der DB in die ListView eintragen
        while (sql_reader.Read())
        {
            entryDataTable.Rows.Add(rowCounter);
            entryDataTable.Rows[rowCounter][0] = sql_reader[0].ToString();
            entryDataTable.Rows[rowCounter][1] = sql_reader[1].ToString();
            entryDataTable.Rows[rowCounter][2] = sql_reader[2].ToString();
            entryDataTable.Rows[rowCounter][3] = sql_reader[3].ToString();
            entryDataTable.Rows[rowCounter][4] = sql_reader[4].ToString();
            entryDataTable.Rows[rowCounter][5] = sql_reader[5].ToString();
            entryDataTable.Rows[rowCounter][6] = sql_reader[6].ToString();
            entryDataTable.Rows[rowCounter][7] = sql_reader[7].ToString();
            rowCounter++;
        }
        sql_reader.Close();
    catch(Exception)
    {
    
    }
    Das ist von der Klasse und nachher gebe ich die dann mit return entryDataTable zurück.

    Hier der Code in der Form:

    Code:
    ListViewItem dataList = new ListViewItem(entryDataTable.Rows[0].ToString());
    usw ...
    listView_Data.Items.Add(dataList);
    Ich erhalte dann den Fehler: der eingabe array ist länger als die anzahl der spalten in dieser tabelle.

  • #2
    Um eine DataTable zu füllen benutzt man einen DataAdapter.

    [HIGHLIGHT=C#]DataTable datatable = new DataTable();
    using(var sql_connection = new SQLConnection())
    {
    sql_connection.Open();
    using(var adapter = new SqlDataAdapter("Select * from Kunde", sql_connection))
    {
    adapter.Fill(datatable);
    }
    }[/HIGHLIGHT]

    Wenn das nur zum befüllen eines ListViews ist weiß ich allerdings nicht wofür das gut sein soll. Dein Code scheint ja die Daten wieder aus der DataTable zu klauben. Wenn das einzige was du tust die da wieder raus zu holen wieso hast du die da erst reingepackt?

    Comment


    • #3
      naja, wie kann ich denn sonst die Daten von dem Sqlreader an die Form zurückgeben?
      Den Sqlreader kann ich ja auch nicht einfach so zurückgeben, das heißt ja, das ich die Daten in irgendwas reinpacken muss oder?

      Jetzt habe ich die DataTable mit Return zurückgegeben und füge die DataTable Einträge über die Row in die ListView ein. (Dafür muss meine Form-Klasse ja nicht einmal die Rows Eigenschaft kennen aber ich kann Sie trotzdem benutzen, schon irgendwie cool.)
      Geht das ganze auch noch irgendwie einfacher oder warum meinst du, das dass keinen Sinn macht.

      Wenn verstehe ich nicht wie das sonst laufen soll ...
      Hast du da ein Beispiel?
      Zuletzt editiert von Threin; 17.03.2014, 17:13. Reason: Ergänzung

      Comment


      • #4
        Für eine Listbox nicht Listview, siehts so aus(sorry hab jetz kein Beispiel parat, aber prinzip ähnlich):
        //Dr ist Datareader
        this.myLisBox.Items.Clear();// keine pflicht, steht nur da weil manchmal nötig
        while (Dr.Read) {
        this.myLisBox.Items.Add(Dr.Item("OrderID").ToStrin g + " " + Dr.Item("ShipCity").ToString);
        }

        Was Ralf glaub ich meint, wenn Du eben nur eine Listbox oder Listview füllen willst, dann reicht ein Datareader, Du musst dann keine Datatable befüllen, für die du über ein Dataadapter gehen musst.
        JonDonym: privacy needs anonymity more than ever

        Comment

        Working...
        X