Laden...

WPF: Datensätze einer SQL DB mit DataGrid anzeigen

Erstellt von nfb503 vor 12 Jahren Letzter Beitrag vor 12 Jahren 11.694 Views
N
nfb503 Themenstarter:in
20 Beiträge seit 2012
vor 12 Jahren
WPF: Datensätze einer SQL DB mit DataGrid anzeigen

Hallo,

nachdem ich die FAQ, zwei Bücher und Tante Google erfolglos befragt habe, hoffe ich, mir kann jemand helfen. Alle Versuche mit ItemSource oder einer List waren erfolglos, ich bin gerade etwas deprimiert, weil ich überhaupt nicht weiterkomme.

Ich habe mit Visual Studio 2012 eine SQL Datenbank erstellt und in das Projekt integriert. Nun möchte ich deren Datensätze in einem DataGrid angezeigt bekommen. Ich kriege das einfach nicht hin, der Zugriff auf die DB klappt, aber das DataGrid füllt sich nicht. Da ich später mit Parametern und Funktionen Datensätze limitieren möchte, gefällt mir der Reader sehr gut, da ich hier jeden Datensatz prüfen kann. Aber wie kann ich hier ein DataGrid füllen ? Mit dem internen Dataset müßte das doch alles ganz einfach gehen.

Die Anwendug soll WPF sein, sonst würde ich mich erstmal ins leichtere Windows Forms einarbeiten.

Hier ist mein Code:

    public partial class DatenFenster : Window
        {

        SqlConnection connection;
        SqlCommand command;
        SqlDataAdapter adapter;
        DataTable dt = new DataTable();
        _Mydatabase_1DataSet = new _Mydatabase_1DataSet;

\*******
HIER SOLL DER GRID GEFÜLLT WERDEN! 
NAME ist GRIDATA und AutoGenerateColumns="True"!
\*******


        public void DBConnect()
            {
            connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename='D:\SkyDrive\Visual C#\ErsteWPF\ErsteWPF\MyDatabase#1.mdf';Integrated Security=True;Connect Timeout=30;User Instance=True");
            command = new SqlCommand("SELECT * FROM data1", connection);
            connection.Open();
            SqlDataReader reader = command.ExecuteReader();
           
            while (reader.Read())
                {
                MessageBox.Show((reader[0] + ", " + reader[1]));
                }

            connection.Close();            
            }
M
47 Beiträge seit 2011
vor 12 Jahren

Nabend!
Du musst ja schon erstmal die DataTable füllen. Das machste mit dem SqlDataReader. Und die DataTable dann einfach ans DataGrid binden.

Gruß,
Mossos

U
58 Beiträge seit 2011
vor 12 Jahren


string conStr = dein connection-string;
            SqlConnection con = new SqlConnection(conStr);
            con.Open();
            SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM datal", con);
            DataTable dt = new DataTable();
            da.Fill(dt);
            dataGrid1.ItemsSource = dt.DefaultView;


im xaml-code "AutoGenerateColumns" auf true setzen.

dann hast du ein erstes ergebnis.

N
nfb503 Themenstarter:in
20 Beiträge seit 2012
vor 12 Jahren

Hallo ihr zwei,

was für ein Gefühl. Ich sehe Daten.
Vielen Dank!!! Ich habe soviel Codes aus Büchern und Internet ausprobiert und keiner führte zum Erfolg.

Zwei Fragen habe ich noch:

  • ich programmiere unter Windows XP. Hier gibt es anscheinend manche Klassen nicht MSDN. Wie kann ich diese denn "nachrüsten"?

  • Wie kann ich eigentlich eine exe Datei bzw eine Installation erstellen? Der Doppelklick auf die exe Datei bei mir klappt, aber natürlich nicht bei einem anderen Rechner.

N
nfb503 Themenstarter:in
20 Beiträge seit 2012
vor 12 Jahren

Entschuldigt, aber mir ist noch eine Frage eingefallen.

Kann man diese DataTable auch anders füllen?
Zum Beispiel über den Reader? Ich poste hier den Code mal und ich würde gerne das DataGrid während der Reader Schleife füllen.
Dann müßte ich die EInschränkunen nicht über ein SQL COmmand treffen, sondern könnte die Abfragen durch das Hinzufügen von Funktionen und Klassen vereinfachen (bin kein SQL-Freak).

Hier nochmal mein ganzer Code:

 public void DBConnect()
            {
            connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename='D:\SkyDrive\Visual C#\ErsteWPF\ErsteWPF\MyDatabase#1.mdf';Integrated Security=True;Connect Timeout=30;User Instance=True");            
            connection.Open();

            //für den DataGrid Zugriff mit einer DataTable
            SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM data1",connection);            
            DataTable dt = new DataTable();
            da.Fill(dt);
            GriDaten.ItemsSource = dt.DefaultView;

            //Andere Verbindung über einen DataReader, hier wird zeilenweise aus der DB gelesen
            command = new SqlCommand("SELECT * FROM data1", connection);
            SqlDataReader reader = command.ExecuteReader();
            ffvalues = new List<string>();
           
            while (reader.Read())
                {
                MessageBox.Show((reader[0] + ", " + reader[1] + ", " + reader[2]));
                ffvalues.Add(reader[0].ToString());
                }
            foreach (string element in ffvalues)
                MessageBox.Show(element);

            connection.Close();
            }
M
47 Beiträge seit 2011
vor 12 Jahren

Wie kann ich eigentlich eine exe Datei bzw eine Installation erstellen? Der Doppelklick auf die exe Datei bei mir klappt, aber natürlich nicht bei einem anderen Rechner.

Z.B: Build/Publish [Projektname]
Ansonsten kannste auch die .exe aus dem Release ORdner nehmen (Debug würde auch gehen). Du musst aber auch evtl erstellte Assemblies etc. auf die in deinem Programm verwiesen wird mitnehmen. Außerdem, wenn dein Programm auf ne Datenbank zugreift, sollte der andere PC auch auf die Datenbank zugreifen können und wenn nötig den SQLConnector installiert haben (je nachdem was du für ne Datenbank benutzt).
Den am anderen PC auftretende Fehler solltest du notfalls debuggen.

Dann müßte ich die EInschränkunen nicht über ein SQL COmmand treffen, sondern könnte die Abfragen durch das Hinzufügen von Funktionen und Klassen vereinfachen (bin kein SQL-Freak).

Was meinst du denn für Einschränkungen?
Generell ist SELECT * FROM... nicht so performant, als wenn man direkt die gewollten Spalten angibt.
Falls du trotzdem nur bestimmte Spalten aus deiner DataTable angezeigt haben willst, musst du die Spalten in WPF selbst erzeugen und "AutoGenerateColmns = False" setzen.
Die einzelnen Spalten bindest du dann an den jeweiligen Spaltennamen der Tabelle aus der Datenbank.

N
nfb503 Themenstarter:in
20 Beiträge seit 2012
vor 12 Jahren

Hallo,

ich habe mich falsch ausgedrückt. Nicht die Spalten möchte ich einschränken, sondern die Datensätze, welche im DataGrid angezeigt werden sollen. Ich habe in der SQL Datenbank um die 500 Datensätze und möchte nur diejenigen im DataGrid anzeigen, welche bestimmte Bedingungen erfüllen.
Zum Beispiel:

  • Einschränkungen anhand eines Datums
  • Einschränkungen anhand von TextWerten

Daher meine Idee mit dme DataReader. Hier habe ich auf jeden Datensatz Zugriff und könnte in ein paar simplen if Abfragen und Funktionen die Bedingungen prüfen. Das würde funktionieren.
Nur kriege ich so das DataGrid nicht angezeigt.

Und bei der Systematik mit dem DataSet weiß ich nicht, wie ich die Datensätze einschränken kann, da das teilweise komplizierte Berechnungen sind, welche ich nicht in SQL umsetzen kann.

So komme ich gerade nicht weiter (und programmiere was anderes), aber früher oder später müßte ich dieses Problem lösen, da die Anzeige der Datensätze ja der Kern der Anwendung ist.

Kann mir hierbei jemand helfen?

M
47 Beiträge seit 2011
vor 12 Jahren

Um das Vernünftig zu machen musst du dir wohl oder übel nen paar basics in SQL anschaffen. Hört sich jetzt aber nicht kompliziert an was du haben willst. Ne Abfrage nach nem Datum oder nem Textwert ist ziemlich leicht in SQL zu realisieren, und halt auch schnell.