Announcement

Collapse
No announcement yet.

Daten aus Datenbank lesen

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

  • Daten aus Datenbank lesen

    Hallo!!!
    Bin ein totaler Anfänger und habe einen Code aus dem Buch "Kochbuch" Visual C#2008 herauskopiert!
    Leider verstehe ich den Code nicht so richtig!
    Frage: Wie kann ich aus der Datenbank aus einer Zeile und einer gewissen Spalte nur einen einzigen Wert od. String herauslesen und in anschließend auf einen Label ausgeben. Kriege das einfach nicht hin.
    Danke für eure Mühe!!!
    Vielleicht kann mir einer den Code so auskommentieren, dass ich ihn als Anfänger auch verstehen kann!
    Mad!
    PS: Im Anhang mein Programm!

    [highlight=c#]using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace ExecuteNonQueryDemo
    {
    using System.Data.OleDb;
    public partial class Form1 : Form
    {

    public Form1()
    {
    InitializeComponent();
    }

    private OleDbConnection conn = null;

    private void Form1_Load(object sender, EventArgs e)
    {
    conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source = Nordwind.mdb;");
    }

    private void execNQuery(string cmdText)
    {
    OleDbCommand cmd = new OleDbCommand(cmdText, conn);
    label1.Text = cmdText;

    try
    {
    conn.Open();
    cmd.ExecuteNonQuery(); // Befehl wird gegen Datenbank ausgeführt
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
    conn.Close();
    }

    private void button1_Click(object sender, EventArgs e)
    {
    string sql = "INSERT INTO Kunden(KundenCode, " + "Firma, Kontaktperson, Ort) VALUES ('" +textBox1.Text + " ', '" + textBox2.Text + "', '" + textBox3.Text + " ' , '" + textBox4.Text + "')";
    execNQuery(sql);
    }

    private void button2_Click(object sender, EventArgs e)
    {
    string sql = "DELETE FROM Kunden WHERE KundenCode = '" + textBox1.Text + "'";
    execNQuery(sql);
    }

    private void button3_Click(object sender, EventArgs e)
    {
    string sql = "SELECT KundenCode, Firma, " + "Kontaktperson, Ort FROM Kunden
    ORDER BY KundenCode";
    OleDbDataAdapter da = new OleDbDataAdapter(sql, conn);
    DataSet ds = new DataSet();
    da.Fill(ds, "Kunden");
    dataGridView1.DataSource = ds;
    dataGridView1.DataMember = "Kunden";
    }
    }
    }[/highlight]
    Zuletzt editiert von papuadive; 22.03.2010, 15:59. Reason: [highlight=c#] eingefügt; künftig bitte selbst machen!

  • #2
    Hallo und willkommen,

    bevor ich mich ernsthaft mit deinem Code befassen, musst du ihn formatieren: Einrückungen und Leerzeilen, das [highlight] habe ich diesmal bereits eingetragen. Gehe auf deinen Beitrag mit "Editieren", dann auf "Erweitert", ändere ihn, benutze die "Vorschau" und erst nach vollständiger Korrektur das "Speichern".

    Im Moment nur soviel:
    Frage: Wie kann ich aus der Datenbank aus einer Zeile und einer gewissen Spalte nur einen einzigen Wert od. String herauslesen und in anschließend auf einen Label ausgeben.
    Antwort: Passenden SELECT-Befehl bauen, der genau diesen einen Wert zurückliefert, dazu ExecuteScalar verwenden:
    Code:
    myLabel.Text = (string)cmd.ExecuteScalar();
    Vielleicht kann mir einer den Code so auskommentieren, dass ich ihn als Anfänger auch verstehen kann!
    Gibt es im "Kochbuch" keine Erläuterungen?

    Es ist auf jeden Fall falsch, dass die DbConnection im Form-Load erstellt und behalten wird. Sie ist nach Verwendung so schnell wie möglich aufzulösen (Dispose). Ebenso grundverkehrt ist es, die Werte in den Sql-Befehl per String-Verknüpfung einzubauen. Benutze unbedingt Parameter!

    Ein Minimalbeispiel für diese beiden Punkte findest du hier.

    Gehört ".mdb" zu Access? Dann ist Oledb korrekt. Wenn es zu MS-SQL gehört, solltest du unbedingt die Sql-Klassen verwenden.

    Wie gesagt: Mehr Antworten gibt es erst nach brauchbarer Formatierung.

    Gruß Jürgen

    Comment


    • #3
      Hallo Jürgen!
      Vielen vielen Dank, für deine Tipps.
      Probiere schon fast 3 Tage (mit Visual C# von Andreas Kühnel) herum, was ich brauche ,"eine Wert oder String aus der Access Datenbank herausholen" habe ich bis jetzt noch nicht gefunden. Komme da einfach nicht weiter, aber ich arbeite an meinen Grundlagen.
      Die Entwicklerbücher sind aber alle ziemlich fett (1200 Seiten hochkomplexe Materie).
      Bezüglich Formatierung: Habe leider nur 2 Button (Vorschau und Absenden)! Bei der Hauptansicht sieht alles formatiert aus, bei der Vorschau ist dann alles wieder futsch. Abspeichern geht gar nicht!
      Irgendwie finde ich mich auf dieser Seite sehr schlecht zurecht. Vielleicht bin ich zu blöd, aber diese Seite hat's in sich!?!?!?

      PS: Was meinst du mit "highlight"
      Danke Mad

      Anbei nochmals der Formatierte Code:
      von Jürgen Thomas gestrichen, weil er nicht als formatierter Code zu erkennen ist
      Zuletzt editiert von Jürgen Thomas; 22.03.2010, 12:36. Reason: Code entfernt, sieht nur wie einfache Wiederholung aus

      Comment


      • #4
        Hallo,
        (mit Visual C# von Andreas Kühnel)
        Also der Herr hat noch mehr Bücher veröffentlicht, z.B. das Openbook: C# 2008 - Kapitel 26.1.5
        Aber nicht jeder hat die Nordwind-DB auf deutsch oder das Kochbuch um etwas konstruktiveres beitragen zu können :-/
        PS: Was meinst du mit "highlight"
        Den Befehl "highlight=c#", siehe auch den ersten Artikel im Zitat
        MfG
        Cheat-Sheets for Developers / Programming Quotes

        Comment


        • #5
          Wenn ich den folgenden Hinweis noch anders formulieren würde, würde jeder glauben, ich schreibe für Blöde, aber nicht für denkende Menschen:
          Originally posted by Jürgen Thomas View Post
          ... musst du ihn formatieren: Einrückungen und Leerzeilen, das [highlight] habe ich diesmal bereits eingetragen. Gehe auf deinen Beitrag mit "Editieren", dann auf "Erweitert", ändere ihn, benutze die "Vorschau" und erst nach vollständiger Korrektur das "Speichern".
          Also gehe auf den ersten Beitrag (denn einen anderen gab es noch nicht, als ich das geschrieben hatte) und ändere diesen. Dann siehst du auch, wie ich das mit highlight gemeint und gemacht hatte.

          Wo sind in deinem letzten Beitrag die Einrückungen zu sehen? Hast du gemerkt, dass es einen Button "Vorschau" gibt? Wozu ist der wohl gedacht?

          Du willst hier Hilfe, also können wir ein wenig Mitdenken und Mitarbeit erwarten. Jürgen

          Comment


          • #6
            Hallo nochmal,
            Frage: Wie kann ich aus der Datenbank aus einer Zeile und einer gewissen Spalte nur einen einzigen Wert od. String herauslesen und in anschließend auf einem Label ausgeben.
            Im wahrscheinlichen Kontext des Kochbuchs und unter Verwendung der Nordwind-DB müsste es so gehen (auch auf die Gefahr hin, dass der Vorschlag nicht richtig sauber ist):
            Code:
            using System;
            using System.Collections.Generic;
            using System.ComponentModel;
            using System.Data;
            using System.Drawing;
            using System.Linq;
            using System.Text;
            using System.Windows.Forms;
            
            namespace ExecuteNonQueryDemo
            {
                using System.Data.OleDb;
                public partial class Form1 : Form
                {
                    public Form1()
                    {
                        InitializeComponent();
                    }
                    private OleDbConnection conn = null;
                    private void Form1_Load(object sender, EventArgs e)
                    {
            
            conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Nordwind.mdb;");
                    
            string sql = "SELECT Artikelname FROM Artikel WHERE Lagerbestand=17";
            execNQuery(sql);
                    }
                    
            private void execNQuery(string cmdText)
            {
            OleDbCommand cmd = new OleDbCommand(cmdText, conn);
            try
            {
            conn.Open();
            cmd.ExecuteNonQuery(); // Befehl wird gegen Datenbank ausgeführt
            label1.Text = (string)cmd.ExecuteScalar();
            // in Label1 sollte Chang erscheinen
            }
            catch (Exception ex)
            {
            MessageBox.Show(ex.Message);
            }
            conn.Close();
            }
                }
            }
            MfG
            Cheat-Sheets for Developers / Programming Quotes

            Comment


            • #7
              @Markus
              Schade, dass du eine Lösung bringst, bevor der Fragesteller die Frage korrekt formuliert. Bei deinem Verfahren passen drei Punkte nicht:

              1. Benutze von vornherein Parameter beim Zusammenstellen des SQL-Strings. (Das passt zwar bei dem Code-Gerüst nicht ganz, sondern benötigt weitere Änderungen, es sollte aber von Anfang an dazugehören.)

              2. Die DbConnection sollte unbedingt und immer in einem using-Block gekapselt werden, damit sie nach Erledigung aufgelöst ist.

              3. Was machen denn zwei Execute-Befehle in deinem Code?

              Gruß Jürgen

              Comment


              • #8
                eine Lösung (..) 1. (..) 2.
                Okay, der Vorschlag gewinnt keinen Schönheitspreis (vermutlich genau wie die dabei benutzte Quelle im ersten Posting). Aber eine passende Abfrage einfügen sollte wohl auch keine grosse Leistung darstellen...
                zwei Execute-Befehle
                Stimmt (cmd.ExecuteNonQuery(); kann man auskommentieren)
                MfG
                Cheat-Sheets for Developers / Programming Quotes

                Comment


                • #9
                  Hallo Jürgen!
                  Danke für deine Info's! Gut Ding braucht Weile, überhaupt bei mir!
                  Ich hoffe dieses Mal ist es so in Ordnung!?
                  Möchte ja alles richtig machen!

                  Danke Nochmals!

                  Hallo Markus, auch dir vielen Dank....
                  Werde es gleich probieren!
                  Danke nochmals
                  Zuletzt editiert von Jürgen Thomas; 22.03.2010, 16:17. Reason: Zwei Beiträge im Abstand von einer Minute muss wirklich nicht sein.

                  Comment


                  • #10
                    Hi Markus, Programm funktioniert, einfach super......!!!
                    Habe noch ein paar Fragen zu deinem Programm, das du gepostet hast!

                    1.) Ist die Struktur so in Ordnung, damit ich auf dieser mein weiteres Programm aufbauen kann? Ausser "cmd.ExecuteNonQuery()" das ich natürlich auskommentiert habe.

                    2.) Wenn das Programm gestartet wird, wird der Wert aus der DB geholt und angezeigt. Wenn sich in der Zwischenzeit die Daten geändert haben, bekommt "label1" es wahrscheinlich nicht mit, oder? Was könnte ich machen, damit es autom. aktualisiert wird?

                    3.) Wenn ich 15 Label's hätte, die ich mit Werten aus der Datenb. befüllen müsste, was müsste ich am Programm von dir ändern....? Vielleicht kannst du es mir nochmal ändern, damit ich dann ordentlich weiter machen kann!

                    ich weiss ich bin lässtig!
                    Danke Mad

                    Comment


                    • #11
                      Originally posted by papuadive View Post
                      1.) Ist die Struktur so in Ordnung, damit ich auf dieser mein weiteres Programm aufbauen kann?
                      Nein. Ich habe oben drei Punkte genannt, und 1. und 2. hat Markus als "nicht schön" bestätigt. Ein kurzes Beispiel dazu steht dort.

                      2.) Wenn das Programm gestartet wird, wird der Wert aus der DB geholt und angezeigt. Wenn sich in der Zwischenzeit die Daten geändert haben, bekommt "label1" es wahrscheinlich nicht mit, oder? Was könnte ich machen, damit es autom. aktualisiert wird?
                      Das geht nur dann, wenn die Datenbank es anbietet. Bei MS-SQL Server nennt sich das SqlDependency. Wenn es das nicht gibt, hilft es nur, in Abständen Änderungen abzufragen.

                      3.) Wenn ich 15 Label's hätte, die ich mit Werten aus der Datenb. befüllen müsste, was müsste ich am Programm von dir ändern....?
                      Das erfordert eine ganze Reihe von Änderungen:
                      a. Der SELECT-Befehl muss mehrere Informationen zurückliefern.
                      b. Dann passt nicht ExecuteScalar, sondern ExecuteReader.
                      c. Die Übernahme der Werte muss 15x aufgerufen werden: als Schleife oder mit direkter Zuordnung und ggf. mit passender Konvertierung.

                      Statt b/c geht auch:
                      b. Hole die Daten mit OledbDataAdapter.Fill in eine DataTable.
                      c. Füge eine BindingSource dazu.
                      d. Binde die BindingSource an die Controls.
                      c/d. Statt mit BindingSource kann die DataTable direkt gebunden werden.

                      Am besten ist es aber, wenn du nicht von einem kleinen Problem zum nächsten springst, sondern dich zielgerichtet einarbeitest. Da dürfte das "Kochbuch" nur bedingt geeignet sein (das enthält zu viele Erläuterungen stückweise in den Rezepten und zuwenig Einführung), das "OpenBook ist wohl etwas besser.

                      Gruß Jürgen

                      Comment


                      • #12
                        Programm von Markus!

                        Hallo Jürgen!
                        Danke für deine "ausführlichen" Anweisungen!

                        Ausgehend von Markus's Programm, könnest du mir bitte das Übungsprogramm von Markus so abändern, damit ich einmal einen Grundstock zum Aufbauen hätte. Mir fehlen momentan noch so viele Einzelteile. Wäre nett von dir.
                        Nur damit ich einmal 10 Label befüllen kann.
                        Werde mich mit opernbook weiterarbeiten.
                        Ich komme leider nicht so recht weiter.
                        Oder hättest du einen besseren Vorschlag!

                        Danke Mad!

                        Comment

                        Working...
                        X