Announcement

Collapse
No announcement yet.

Das DataGridView zeigt keine Daten an bei einer DB-Anwendung

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

  • Das DataGridView zeigt keine Daten an bei einer DB-Anwendung

    Hallo Leute, ich bin neu hier im Forum und möchte einmal alle begrüßen und sich bei allen Bedanken, die anderen Leuten immer wieder helfen und Ihre Erfahrungen hier herein schreiben!!!

    Nun zu meinem Problem:
    Ich habe ein Datenbank-Client Projekt entwickelt bzw. ich bin gerade dabei und habe ein Problem mit allen DataGridView's!

    Die DGVs zeigen beim Debuggen keine Daten von der Datenbank an.

    Das Programm besteht aus 2 Klassenbibliotheken, der libDAL (DataAccessLayer) und der libBL (BusinessLogic), und aus einer Windows-Forms Anwendung.

    Der Datenbank-Zugriff der DataGridView ist Objekt-basierend.

    Das komische ist, dass das DataGridViews jeweils pro Datenbank-Tabelle den Primary Key (habe ich als int deklariert) und einen bool-Datentyp anzeigt mittels einer Checkbox.
    Das DataGridView zeigt auch genau so viele Zeilen an, wie die Datenbank hat!

    Ich habe jeweils eine zweite Windows Form erstellt, um die Daten aus dem DataGridView zu ändern, also zum NEU hinzufügen eines Datensatzes und um einen Datensatz zu BEARBEITEN.
    In einer Windows Form von diesen habe ich zwei verschiedene BindingSources implementiert um in einer ComboBox, die Daten einer anderen Tabelle anzuzeigen.
    UND DAS FUNKTIONIERT!
    Wenn ich einen neuen Datensatz erstelle und danach in der Windows Form mit dem DGV mittels einem Button eine Gespeicherte Prozedur bspw. "UPDATE" ausführe, dann zeigt das DataGridView die neue Zeile an und den fortlaufenden Primary Key, der immer um 1 erhöht wird. Die NEUEN Daten sind auch in der Datenbank zu sehen, wenn ich eine Tabelle öffne in der "Microsoft SQL Server Express Edition"!

    Ich habe schon einmal ein Projekt nach dem gleichen Schema programmiert, und dort funktioniert der Datenzugriff ganz normal! Beide Projekte sind in C# und mit dem VS 2008 erstellt worden.

    Ich bin über jeden Tipp und über jeden Ratschlag den Ihr mir geben könnt sehr dankbar!


    LG T-Back

  • #2
    Kann mir niemand weiterhelfen?

    Ich bin schon am verzweifeln!!!!


    MFG

    Comment


    • #3
      Ich erkläre das Problem erneut,

      Ich habe ein Datenbank Client Programm entwickelt mit einer BusinessLogic (dort habe ich für jede Tabelle der Datenbank eine Klasse entwickelt, damit ich auf die Stored Procedures zugreifen kann und SQL-Abfragen machen kann) und einem DataAccessLayer (dort sind die Methoden für den Datenbankzugriff - SqlConnection, usw...)

      Wenn das Programm debugge, kann ich zur Laufzeit, beispielsweise die Stored Procedure für einen neuen Datensatz ausführen - diese ist aber nicht im selben Formular, wie das DataGridView.

      In dem Formular wo das DataGridView ist, sieht man die ID's der Datensätze und somit auch die Zellen/Zeilen der DB-Tabelle, nur dass eben die Zellen leer sind bis auf die ID's.
      Wenn ich dann eine SP ausführe für einen neuen Datensatz und lege den auch an und dann fürhe ich eine SP für UPDATE aus, dann hat das DataGridView um eine Zeile mehr (und auch eine ID, die man sieht, diese habe ich im Programm als int deklariert).

      Das Programm ist Objekt gebunden. Also bei Datenquelle habe ich beim Assistenten "Objekt" ausgewählt, was eine Klasse der BusinessLogic ist.

      Ich hoffe ich habe es jetzt besser erklären können?

      Ich bin schon am Verzweifeln!

      Danke für jede Antwort!!!!

      MFG

      Comment


      • #4
        lso bei Datenquelle habe ich beim Assistenten "Objekt" ausgewählt, was eine Klasse der BusinessLogic ist.
        Du meinst den "Data Source Configuration Wizard"? Denn man zum Beispiel bei der Datasource Property einer BindingSource erhält, oder?

        Sind die Columns in den DataGridViews Autogenerated oder machst du die manuell?

        Kannst du eine minimal Beispielanwendung die das Problem zeigt schreiben und anhängen? Oder wenn das zu aufwendig ist uns zumindest den Code der ColumnsDefinition im DataGridView das Interface deines anzuzeigenden Objekts und die Zuweisung zur Datasource/BindingSource zeigen?

        Comment


        • #5
          Hallo,

          Ich habe es schon zusammengebracht, dass das DataGridView Daten anzeigt!
          Mit der Anweisung: dgv.autogeneratecolums = true;


          Ich hätte eine Bitte an euch, könntet Ihr euch evtl. meinen Code kurz durchschauen, da ich einige Probleme noch in meiner Anwendung habe:

          1.) Wenn ich die Stored Procedure "DELETE" ausführen möchte funktioniert diese bei KEINER Tabelle!
          Ich habe aber alle SPs im SQL-Server Managemant Studio getestet, also DB-mäßig stimmen alle Parameter der Prozedur.

          2.) Wenn ich bestimmte SQL Anweisungen im Programm ausführen möchte, z.Bsp. einen Datensatz bearbeiten, dann kommt eine SqlException mit der Fehlermeldung: Falsche Syntax in der Nähe von '='. in der Methode ExecuteDatatableView() die sich in der Klasse DAL.cs befindet.

          Diese Klasse ist für die Verbindung zur Datenbank mit den Objekten wie SqlConnection, SqlCommand, SqlDataReader, usw...
          Hier werden die Verbindungen geöffnet und geschlossen.

          Ich stelle sie hier herein.

          Ich bin für jeden Verbesserungsvorschlag, Ratschlag und Tipp sehr dankbar!

          Dann hätte ich noch eine Frage, wo finde ich die Nummern der Fehlermeldungen, wenn ich einen try-catch Block einbaue mit einem SqlException Objekt im catch Block, dann kommt die gleiche Meldung "Falsche Syntax in der Nähe von '=' Fehler: 102"


          Die Klasse DAL.cs


          Code:
          using System;
          using System.Collections.Generic;
          using System.Text;
          
          using System.Data;
          using System.Data.SqlClient;
          using System.Configuration;
          
          namespace libDAL
          {
              public class DAL
              {
          
                  public static SqlConnection DBconn()
                  {
                      // Verbindungssettings aus der app.config lesen und zurückgeben.
                      return new SqlConnection(ConfigurationManager.ConnectionStrings["PrivateBuchverwaltung"].ConnectionString);
                  }
          
          
          
                  public static SqlParameter DBparameter(string sVariablenName, object oWert)
                  {
                      return new SqlParameter(sVariablenName, oWert);
                  }
          
          
          
                  // Prozedur Methode - StoredProcedure Methode
                  public static void ExecuteNonQuerySP(string sStoredProcedureName, params SqlParameter[] SqlPar)
                  {
                      SqlCommand cmd = new SqlCommand(sStoredProcedureName, DAL.DBconn());
          
                      cmd.CommandType = CommandType.StoredProcedure;
          
                      // Parameter zum Command hinzufügen
                      foreach (SqlParameter p in SqlPar)
                      {
                          cmd.Parameters.Add(p);
                      }
          
                      // Daten abrufen
                      cmd.Connection.Open();
          
                      
                      // Methode der Klasse SqlCommand, um DateSätze einzufügen oder zu ändern.  Sie liefert die Anzahl der Zeilen, die durch das
                      // Kommando geändert wurden zurück. Das gilt für UPDATE, DELETE und NEW, bei anderen Kommandos liefert sie den Wert -1 zurück.
          
                      // TODO: SPs in DAL SQL-Exception wurde nicht behandelt bei "Neuen BuchTitel"
                      // TODO: SPs in DAL: Meldung: Die Prozedur oder Funktion 'spBuchTitelnNEW' erwartet den '@ISBN10'-Parameter, der nicht bereitgestellt wurde.
                      cmd.ExecuteNonQuery();
                                  
                      // Verbindung schließen!
                      cmd.Connection.Close();
                  }
          
          
          
                  public static DataTable ExecuteDataTableView(string sSQL, params SqlParameter[] SqlPar)
                  {
                      DataTable dt = new DataTable();
          
                      SqlCommand cmd = new SqlCommand(sSQL, DAL.DBconn());
          
                      cmd.CommandType = CommandType.Text;
          
                      // Parameter zum Command hinzufügen
                      foreach (SqlParameter p in SqlPar)
                      {
                          cmd.Parameters.Add(p);
                      }                                  
                                            
                      SqlDataReader dr;
          
                      cmd.Connection.Open();
          
                      dr = cmd.ExecuteReader();
                                   
                      // Daten vom DataReader in die Tabelle übergeben!
                      dt.Load(dr);
          
                      cmd.Connection.Close();
          
                      return dt;
                  }
              }
          }
          
          
          // Die Methode ExecuteReader liefert ein Objekt des SqlDataReaders zurück
          // und wird verwendet bei "SELECT" - Abfragen.
          // TODO: SQL - Exception kommt hier immer wieder MELDUNG: Falsche Syntax in der Nähe von '='

          Das Programm funktioniert Objekt-basierend, damit meine ich, dass die Datenbindung der DGVs und anderen Windows Formularen, wo ich die Datenbank bearbeiten kann über eine BindingSource Komponente erfolgt. Für jede BindingSource habe ich eine Klasse in der BusinessLogic geschrieben.
          Damit meine ich wenn ich im DatenExplorer von Visual Studio auf neue Datenquelle hinzufügen klicke, dann wähle ich dort "OBJEKT" aus und nicht "DATENBANK"


          DANKE NOCHMALS!!!

          MFG

          Comment


          • #6
            Hallo,

            zunächst fällt mir auf, dass Du zwar bei jedem DbCommand eine neue DbConnection erzeugst (das ist korrekt), diese aber nur geschlossen und nicht aufgelöst (Dispose) wird. Vorschlag: Setze in ExecuteNonQuerySP um alles andere herum noch einen using-Block mit "new DbConnection", dann ist die Auflösung gewährleistet. Dann kannst Du alle Parameter mit AddRange auf einmal zuordnen.

            Zu den eigentlichen Problemen: Auch wenn es im Management Studio funktioniert, kann es an irgendwelchen Schreibweisen bei den StoredProcedures und/oder den Parametern liegen. Vor allem die zu 2. genannte Fehlermeldung deutet darauf hin. Im TODO-Kommentar steht etwas mit "Neuen BuchTitel"; das liest sich wie ein falscher Name (mit Leerzeichen).

            Vielleicht solltest du in dieser Weise die verwendeten Bezeichner prüfen. Jürgen

            Comment


            • #7
              DANKE FÜR DEINE HILFE!

              Könntest du mir bitte ein Beispiel in dieser Methode zeigen, wie du mit der using Direktive und "new DbConnection" alle Parameter mit AddRange aufeinmal zuordnest.

              So wie du mir das oben beschrieben hast.

              Das währe serh nett von dir!!!!

              MFG
              Zuletzt editiert von T-Back; 25.03.2009, 10:17.

              Comment


              • #8
                Ich habe meinen letzten Beitrag editiert, deshalb dieser Eintrag.
                MFG

                Comment


                • #9
                  Hallo,

                  das Wörtchen "Dann" in meinem letzten Beitrag hat zu einem Missverständnis geführt. Das AddRange hat nichts mit dem using-Block zu tun, sondern ist eine zweite kleine Änderung. Aber ich kann natürlich angeben, was ich meine:

                  In der Klasse DAL wird nicht die DbConnection als Methode fest eingetragen, sondern nur der ConnectionString als Eigenschaft. Dann geht es etwa so:
                  Code:
                          public static void ExecuteNonQuerySP(
                                  string sStoredProcedureName, params SqlParameter[] SqlPar)
                          {
                              using(SqlConnection conn = new SqlConnection(DAL.DBconnString))
                              {
                                  // Command erzeugen mit Parametern
                                  SqlCommand cmd = new SqlCommand(sStoredProcedureName, conn);
                                  cmd.CommandType = CommandType.StoredProcedure;
                                  cmd.Parameters.AddRange(SqlPar);
                  
                                  // Daten abrufen
                                  conn.Open();
                                  cmd.ExecuteNonQuery();
                                          
                                  // Verbindung wird automatisch geschlossen
                              }
                          }
                  Wie gesagt: das verschönert "nur" den normalen Arbeitsablauf, hat aber mit den eigentlichen Problemen wenig bis nichts zu tun. Jürgen

                  Comment


                  • #10
                    Hallo Jürgen,

                    Danke für deine Hilfe!!!

                    Ich werde meine Klasse dann gleich umbauen und schreibe dann die Ergebnisse mit der neuen Methode hier rein.

                    MFG Philipp

                    Comment

                    Working...
                    X