C# DataGrid befüllen --> gibt einen Fill Fehler zurück

_CH_K_1991_

Lieutenant
Registriert
Nov. 2008
Beiträge
772
Guten Tag zusammen
Ich habe wieder einmal eine Frage zu C#.

Ich möchte ein DataGrid befüllen in dem ich folgenden Code ausführe:



//DatabaseConnection

SqlCeConnection conn = new SqlCeConnection("Data Source=budgetplaner.sdf;Persist Security Info=False;");


Das führe ich im "public partial class" aus!



privatevoid frm_budgetplaner_Load(object sender, EventArgs e)

{

conn.Close();

conn.Open();


//GridView aktualisieren

try

{

string Cmdbudget = string.Empty;

using (conn)

{

SqlCeCommand cmd_greattable = newSqlCeCommand("SELECT Beschreibung, Kategorie, Datum, Betrag, Währung, EinAusZahlung FROM BUDGET");

SqlCeDataAdapter adp_greattable = newSqlCeDataAdapter(cmd_greattable);

DataTable dtbudget0 = newDataTable("Beschreibung");

DataTable dtbudget1 = newDataTable("Kategorie");

DataTable dtbudget2 = newDataTable("Datum");

DataTable dtbudget3 = newDataTable("Betrag");

DataTable dtbudget4 = newDataTable("Währung");

DataTable dtbudget5 = newDataTable("Zweck");

adp_greattable.Fill(dtbudget0);

adp_greattable.Fill(dtbudget1);

adp_greattable.Fill(dtbudget2);

adp_greattable.Fill(dtbudget3);

adp_greattable.Fill(dtbudget4);

adp_greattable.Fill(dtbudget5);

dataGridView1.DataSource = dtbudget0.DefaultView;

}

}

catch (Exception ex)

{

MessageBox.Show(ex.ToString(), "Fehler!", MessageBoxButtons.OK, MessageBoxIcon.Error);

}


}


Das Problem ist nun, dass dieser Versuch das GridView abzufüllen in einem solchen Fehler endet:

fill.jpg

Besten Dank für Hilfe

PS: @Moderator leider konnte ich den Code nicht in die vorgesehenen Code Tags einschliessen, gib es hierzu einen bekannten Fehler (IE10).
Danke
 
Debugger hast du angeschmissen und geschaut wo der Fehler entsteht?
Ansonsten kannst auch manuell CODE und /CODE mit eckigen Klammern angeben - macht das gleiche für Code ;)
 
Zum einen bin ich mir nicht sicher, ob die Connection noch nutzen kannst, wenn du sie einmal geschlossen hast (warum schließt du die überhaupt, wenn du sie nutzen willst?). Aber spätestens, wenn der using-Block verlassen wird, kann du das Objekt sowieso vergessen, ich glaube nicht, dass Open() dann noch korrekt funktioniert.
 
hallo zusammen

Danke für die Antworten.
@SymA
Jap habe ich, der Fehler entsteht bei
Code:
[FONT=Consolas][SIZE=4][FONT=Consolas][SIZE=4][FONT=arial]adp_greattable.Fill(dtbudget0);[/FONT][/SIZE][/FONT][/SIZE][/FONT]

und ja ich weiss, nur hat der Editor von CB Mühe mit den Farben aus der Visual Basic Express Umgebung.

@Darlis
Danke für deinen Hinweis, jedoch sollte dies ohne Probleme möglich sein, da ich das selbe Projekt schon mit einer MySQL Datenbank verwirklicht habe, ich habe jetzt den genau gleichen Code genommen und das ganze für eine MS SQL Compact Datenbank, da ja eine MySQL Datenbank für ein so kleines Projekt nicht wirklich sinnvoll wäre.
Ich schliesse die Verbindung zuerst um einfach sicherzustellen, dass die Verbindung geschlossen ist bevor ich sie erneut öffne, denn ansonsten gibt es einen Fehler der ausgibt, dass die Verbindung schon erstellt ist.

Danke, gibt es weitere Tipps oder Hinweise?


PS: @SymA
siehste den genialen Code ;)
hier nochmals ohne Tags:adp_greattable.Fill(dtbudget0);





 
Zuletzt bearbeitet: (Code angepasst)
Hallo,


du hast vergessen, die Connection deinem Command-Objekt zuzuweisen.
Und das Open() und Close() benötigst du bei using() nicht, da damit alles von alleine geschieht...;)

versuche es mal mit dem Beispiel:

using System;

using System.Data;

using System.Data.SqlServerCe;

using System.Windows.Forms;


namespace TestprojektForum

{

publicpartialclassForm1 : Form

{

SqlCeConnection conn = newSqlCeConnection("Data Source=test.sdf;Persist Security Info=False;");


public Form1()

{

InitializeComponent();

}


privatevoid Form1_Load(object sender, EventArgs e)

{

try

{

string Cmdbudget = string.Empty;


using (conn)

{


SqlCeCommand cmd_greattable = newSqlCeCommand("SELECT Beschreibung, Kategorie FROM Budget", conn);

SqlCeDataAdapter adp_greattable = newSqlCeDataAdapter(cmd_greattable);

DataTable dtbudget0 = newDataTable("Beschreibung");

DataTable dtbudget1 = newDataTable("Kategorie");


adp_greattable.Fill(dtbudget0);

adp_greattable.Fill(dtbudget1);


dataGridView1.DataSource = dtbudget0.DefaultView;

}

}

catch (Exception ex)

{

MessageBox.Show(ex.ToString(), "Fehler!", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

}

}
/
Ergänzung ()

Und noch ein Hinweis:
Falls du tatsächlich mit Open() und Close() arbeiten willst, aber nicht auf eine bestehende Verbindung treffen willst, kannst du das gezielt so abfragen:
if (conn.State == ConnectionState.Closed)
conn.Open();


Und umgekehrt geht es genauso:
if (conn.State == ConnectionState.Open)
conn.Close();
 
Zuletzt bearbeitet:
hey inteller

Na was soll ich sagen :) du hast diesen kleinen Fehler gefunden, der diese Exeption auslöste ;)
Besten Dank für deine Mühe den Code anzuschauen und danke für deinen Tipp mit der Abfrage für die Connection, werde ich sicher noch brauchen können.

thx
Gruss Matthias
Ergänzung ()

Ah bei etwas könntet ihr mir sicher auch noch helfen...
Ich habe leider noch sehr wenig Erfahrung mit der Arbeit von Klassen wie könnte ich jetzt folgender Code in eine Klasse umsetzen, denn dieser benötige ich ein paar Mal, wäre ja blöd diesen jedes Mal neu zu schreiben:

//KATEGORIE HINZUFÜGEN

private void btn_addkat_Click(object sender, EventArgs e)

{

if (conn.State == ConnectionState.Closed)

conn.Open();



SqlCeCommand cmd_addkat = new SqlCeCommand("INSERT INTO KATEGORIE (Kategorie) VALUES ('" + txt_kat.Text + "')", conn);

string addkat = cmd_addkat.ExecuteNonQuery().ToString();

if (addkat == "1")

{

DialogResult result_addkat = MessageBox.Show("Kategorie wurde erfolgreich hinzugefügt! Möchten Sie eine weitere Kategorie hinzufügen?"

, "Success", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

if (result_addkat == DialogResult.Yes)

{

//Clear Drop Down (ansonsten summieren sich die Einträge)

comboBox_kat.Items.Clear();


//ComboBoxen Kategorie

SqlCeDataReader rd_fillkat;

SqlCeCommand cmd_fillkat = new SqlCeCommand("SELECT Kategorie FROM KATEGORIE", conn);

rd_fillkat = cmd_fillkat.ExecuteReader();

while (rd_fillkat.Read())

{

try

{

comboBox_kat.Items.Add(rd_fillkat.GetValue(0).ToString());

}

catch (Exception ex)

{

MessageBox.Show(ex.ToString(), "Failure", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

txt_kat.Clear();

}

else

{

this.Close();

}

}

else

{

MessageBox.Show("Beim Hinzufügen der Kategorie ist ein Fehler passiert.", "Failure", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}


Danke an alle.
Gruss
 
"Code in eine Klasse umsetzen" ist recht .... ungenau. Du hast also mehrere ComboBoxen mit Kategorien und willst diese mit nur einer Methode befüllen, anstatt auf jeder Seite nochmal den selben Code zu schreiben?

Dann erstelle dir eine Klasse "DbAdapter" o.Ä. und darin eine public static Methode "GetCategories" o.Ä.. Diese sollte am besten unabhängig von der View sein. D.h. du übergibst dieser keine ComboBox zum befüllen, sondern lässt die Methode die Kategorien als Liste zurück geben. Damit hast du den reinen Datenbankzugriff in einer Methode gekapselt. Idealerweise lässt du diese Klasse auch die SqlConnection verwaltet, dann hast du alles was mit DB zu tun hat in einer Klasse. Wenn du z.B. auf eine andere DB umsteigst, musst du nur diese eine Klasse austauschen.

Dann kannst du dir eine neue Klasse für GUI-Elemente erstellen, die dann oft benötigte Methoden bereitstellt, wie z.B. ComboBoxen mit Kategorien zu füllen, natürlich unter Verwendung der eben erstellten GetCategories-Methode.

Und bitte das nächste mal den Code in [CODE][/CODE]-Tags setzen.
 
werde ich mir mal anschauen, das mit dem Code geht so ja nicht (siehe die ersten paar Posts), da der Text Editor sich nicht so gut mit den Farben oder was auch immer versteht.

Danke
 
Zurück
Oben