Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Nullreferenz nach Einführen neuer Methode - Der Objektverweis wurde nicht auf eine Objektinstanz ...
nullbytes
myCSharp.de - Member



Dabei seit:
Beiträge: 18

Themenstarter:

Nullreferenz nach Einführen neuer Methode - Der Objektverweis wurde nicht auf eine Objektinstanz ...

beantworten | zitieren | melden

verwendetes Datenbanksystem: <MySQL / .mdf>

Hallo Freunde,

ich bin in der Lage bin ein DataGrid mit Daten aus einer DB zu füllen und diese Daten später auf Button-Druck in die DB zurückzuspielen und dort zu speichern (Stichwort: update). Dies klappt wunderbar.

Nun habe ich mir eine Methode in einer Klasse erstellt, mit der ich diese beiden Funktionen auslagern und universeller gestalten möchte und weitergehend den Quelltext im Projekt übersichtlich und sparsam zu halten.

Am Quelltext habe ich nichts geändert.


internal class DBQuery
    {

        string path = Environment.CurrentDirectory;
        string db_name = "DB100.MDF";

        SqlDataAdapter da;
        SqlCommandBuilder cmdbl;
        DataTable dt;

        //Methode zum Füllen von DataGrids
        public void DB_Fill_DataGrid(string sql, DataGrid datagrid_name)
        {
            //Connection-Objekt
            SqlConnection conn = new SqlConnection();
            conn.ConnectionString = @"Data Source=.\SQLEXPRESS;" +
                                    @"AttachDbFilename=" + path + @"\" + db_name + @";" +
                                     "Integrated Security=True;" +
                                     "Connect Timeout=30;" +
                                     "User Instance=True";

            try
            {
                //Command-Objekt
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                cmd.CommandText = sql;

                //DataAdapter
                da = new SqlDataAdapter(cmd);
                dt = new DataTable();

                //DataTable + GridView füllen
                da.Fill(dt);
                datagrid_name.ItemsSource = dt.DefaultView;
                da.Update(dt);

                conn.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                conn.Close();
            }
            finally
            {
                conn.Close();
            }
        }

       //Methode zum Updaten des DataGrids
        public void DB_Update_DataGrid(int update)
        {
            if(update == 1)
            {
                //MsgBox - Wirklich aktualisieren?
                MessageBoxResult result = MessageBox.Show("Achtung!\nEs werden Änderungen an der Datenbank vorgenommen!\n\nMöchten Sie fortfahren?", "Datenbankänderung", MessageBoxButton.YesNo, MessageBoxImage.Warning);

                if (result == MessageBoxResult.Yes)
                {
                    try
                    {
                        cmdbl = new SqlCommandBuilder(da);
                        da.Update(dt);
                        MessageBox.Show("Änderungen erfolgreich", "Erfolgreich", MessageBoxButton.OK, MessageBoxImage.Information);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message + "\n\nEs wurden keine Daten geändert!", "Fehler!", MessageBoxButton.OK, MessageBoxImage.Error);
                    }
                }
            }
        }
        }
    }

Diese beiden Methoden rufe ich jetzt bei zwei verschiedenen Events auf:

        //Modell in CMB wurde ausgewählt
        private void cmb_Edit_Modell_DropDownClosed(object sender, EventArgs e)
        {
            if (cmb_Edit_Modell.SelectedItem != null)
            {

                //SQL-Anweisung
                string sqlcommand = "bla bla bla";

                DBQuery Fill_DataGrid = new DBQuery();
                Fill_DataGrid.DB_Fill_DataGrid(sqlcommand, dataGrid_Edit_Auswahl);
            }
        }

        //Update Button
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            DBQuery update = new DBQuery();
            update.DB_Update_DataGrid(1);
        }

Mein Problem ist jetzt, dass ich beim Drücken auf den Update-Button beim zurückspielen meiner Daten in die Datenbank die Fehlermeldung "
Fehler
Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt
" bekomme.

Ich glaube auch zu wissen woran das liegt (nämlich das ich mit DBQuery update = new DBQuery() ein neues Objekt instanziere und nicht auf das bereits erstellte zurückgreife - richtig?), jedoch weiß ich nicht wie ich dieses Problem behebn kann...

Hat da jemand eine Idee und kann mir helfen?
private Nachricht | Beiträge des Benutzers
Jamikus
myCSharp.de - Member



Dabei seit:
Beiträge: 251
Herkunft: Oberhausen (NRW)

beantworten | zitieren | melden

[Artikel] Debugger: Wie verwende ich den von Visual Studio?

damit sucht man nun den null-verweis :)
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16148

beantworten | zitieren | melden

[FAQ] NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
nullbytes
myCSharp.de - Member



Dabei seit:
Beiträge: 18

Themenstarter:

beantworten | zitieren | melden

Hallo,

danke erstmal für Eure Hilfe!

Ich habe mich jetzt versucht mit Hilfe des Debuggers und der Fehlermeldung wie in den verlinkten Posts zum Problem vorzuhangeln.
Dafür habe ich mir nach kurzem einlesen die StackTrace-Funktion zu eigen gemacht.

Ich glaube mein Problem auch gefunden zu haben.

In der Methode zum Updaten der Klasse bleibt die Anweisung

da.Update(dt);
laut Debugger null.

Das sollte heißen, dass ich wie im oben verlinkten Post mich um die NullReferenceException kümmern sollte. Dafür habe ich mir das Beispiel zu hilfe gemacht.

Aus

 
                     try
                    {
                        cmdbl = new SqlCommandBuilder(da);
                        da.Update(dt);
                        MessageBox.Show("Änderungen erfolgreich", "Erfolgreich", MessageBoxButton.OK, MessageBoxImage.Information);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message + "\n\nEs wurden keine Daten geändert!", "Fehler!", MessageBoxButton.OK, MessageBoxImage.Error);
                    }
wurde folgender Versuch:


                     try
                    {
                        cmdbl = new SqlCommandBuilder(da);
                        if (da != null)
                        {
                            da.Update(dt);
                            MessageBox.Show("Änderungen erfolgreich", "Erfolgreich", MessageBoxButton.OK, MessageBoxImage.Information);
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.StackTrace + "\n\nEs wurden keine Daten geändert!", "Fehler!", MessageBoxButton.OK, MessageBoxImage.Error);
                    }

Immerhin - beim Ausführen des Programmes fliegen mir keine Exceptions mehr um die Ohren, ich habe den Fehler also in der Tat gefunden. Meine Datenbank wird aber auch nicht geupdatet... X(

Kann mir wer erklären was ich falsch gemacht habe bzw. wie ich das jetzt ändere?

Irgendwie muss ich doch jetzt den DataAdapter da neu initialisieren, oder?
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von nullbytes am .
private Nachricht | Beiträge des Benutzers
witte
myCSharp.de - Member



Dabei seit:
Beiträge: 966

beantworten | zitieren | melden

... weil Du wahrscheinlich Update ohne Fill aufrufst. Erzeuge da und dt im Konstruktor nicht in Fill.
BTW wass soll eigentlich if(update == 1) bezwecken ?
private Nachricht | Beiträge des Benutzers
nullbytes
myCSharp.de - Member



Dabei seit:
Beiträge: 18

Themenstarter:

beantworten | zitieren | melden

Du meinst so?

public void DB_Update_DataGrid(DataGrid datagrid_name, SqlDataAdapter da, DataTable dt)
        {
            //MsgBox - Wirklich aktualisieren?
            MessageBoxResult result = MessageBox.Show("Achtung!\nEs werden Änderungen an der Datenbank vorgenommen!\n\nMöchten Sie fortfahren?", "Datenbankänderung", MessageBoxButton.YesNo, MessageBoxImage.Warning);

            if (result == MessageBoxResult.Yes)
            {
                try
                {
                    cmdbl = new SqlCommandBuilder(da);
                    
                    if (da != null)
                    {
                        da.Fill(dt);
                        datagrid_name.ItemsSource = dt.DefaultView;
                        da.Update(dt);
                        MessageBox.Show("Änderungen erfolgreich", "Erfolgreich", MessageBoxButton.OK, MessageBoxImage.Information);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message + ex.StackTrace + "\n\nEs wurden keine Daten geändert!", "Fehler!", MessageBoxButton.OK, MessageBoxImage.Error);
                }
            }

Ja...öööh... wie rufe ich die Methode denn dann auf? Da muss sich neben dem Namen des DataGrids für die Darstellung dies Grids ja auch noch ein DataAdapter und ein DataTable übergeben... macht das Sinn?

Irgendwie komme ich mir so vor als würde ich mehr "raten" was ich hier programmiere anstatt wirklich zu wissen was ich hier mach... hätte nicht gedacht, dass es so schwer ist diese einfache Funktion einfach in eine separate Methode auszulagern... X(

Edit: Dieses if(update ==1) war Unsinn und entstammte aus einer anderen Lösungsversuch. Copy&Past Überbleibsel... Habs entfernt, danke für den Hinweis!
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von nullbytes am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16148

beantworten | zitieren | melden

Du hast in dieser Methode aktuell:
- UI Elemente (Messagebox)
- Business-Logik (was passiert beim Drücken von "Yes"
- Datenbankabfragen

Ich kann Dir nur empfehlen, dass Du Deine Schichten trennst, was auch ungemein viel (doppelten) Code einspart.
Nimm Dir 5 Minuten Zeit und les Dir [Artikel] Drei-Schichten-Architektur aufmerksam durch.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
nullbytes
myCSharp.de - Member



Dabei seit:
Beiträge: 18

Themenstarter:

beantworten | zitieren | melden

Hey Abt,

danke für den Link!

Den Beitrag kenne ich als ich damals bei Anmeldung etwas durchs Forum gestöpert habe. Ich habe ihn trotzdem nochmal gelesen und weiß zwar was du mir sagen möchtest, in diesem Fall aber nicht was ich konkrett ändern sollte und wie mir das bei meinem Problem weiterhilft...

In der Tat habe ich in diesem Fall nicht wirklich an die 3-Schichten-Trennung gedacht. Ich versuche zwar oft GUI von Logik und diese wiederum von Datenbankaktivitäten zu trennen, doch speziell hier ist mir das vielleicht nicht gelungen.

Ich mein Ziel war es eigentlich Quelltext zu sparen, indem ich bestimmte, sich ständig wiederholende Aktivitäten einfach auslagere (wie z.b. das füllen eines DataGrids mit Daten oder das Updaten dieser). Da es sich hier um eine Datenbankaktivität handelt, befindet die sich auch in einer Klasse wo sich nur Methoden welche mit Datenbankaktivitäten zu tun hat befinden. Ich habe noch ein paar andere Klassen. Dort findet i.d.R. entweder Logik oder Optionen um Steuerelemente zu manipulieren (z.b. die Inhalte aus Textboxen zu löschen oder Steuerelemente auszugrauen). Ich denke also - korrigiere mich gerne - das ich schon bemüht bin mich an dieses 3-Schichten-Modell zu halten.

Leider stehe ich immer noch bei dem Problem das ich die Methode nicht zum Laufen bekomme. Weiterhin wäre ich über weitere Hinweise was du konkret anders machen würdest dankbar! Vielleicht sind meine Fragen für Euch Profis ziemlich simpel, aber ich bemühe mich und nehmen gerne Lehre an
private Nachricht | Beiträge des Benutzers
Coffeebean
myCSharp.de - Team

Avatar #avatar-3295.gif


Dabei seit:
Beiträge: 2461
Herkunft: Deutschland/Schweiz

beantworten | zitieren | melden

Zitat von witte
... weil Du wahrscheinlich Update ohne Fill aufrufst. Erzeuge da und dt im Konstruktor nicht in Fill.

Witte hats schon gesagt. "da" ist der Klasse bekannt. Aber erst in "fill" sagst du "da = new SqlDataAdapter(cmd);". Erst ab dort ist "da" nicht mehr null. Du rufst "Update" auf, aber "Fill" vorher nicht --> "new ..." wird nie aufgerufen, da bleibt null und es knallt.

Daher: Erzeuge "da" im Konstruktor.
private Nachricht | Beiträge des Benutzers
nullbytes
myCSharp.de - Member



Dabei seit:
Beiträge: 18

Themenstarter:

beantworten | zitieren | melden

Guten Morgen,

das erschließt sich mir alles nicht.

1.) Wenn ich den SqlDataAdapter da und den DataTable dt im Konstruktor aufrufe, muss ich diesen doch auch mit bei Methodenaufruf übergeben, sprich quasi:


//Methode
public void DB_Update_DataGrid(DataGrid datagrid_name, SqlDataAdapter da, DataTable dt)
{
...
}


//Aufruf
SqlDataAdapter da = new SqlDataAdapter();
DataTable dt = new DataTable();
DBQuery change = new DBQuery();
change.DB_Update_DataGrid(dataGrid_Edit_Auswahl, da, dt);

Das sieht für mich alles nach doppelt- und dreifachen Code aus?

2.) Ich habe das jetzt mal da und dt im Programm initialisiert, bei Methodenaufruf übergeben und durchlaufen lassen. Natürlich bekomme ich die Fehlermeldung
Fehler
"$exception {"Die SelectCommand-Eigenschaft wurde nicht initialisiert vor dem Aufruf von: 'Fill'."} System.Exception {System.InvalidOperationException}"

Klingt logisch, da ja bei meinem SqlAdataper die Übergabe des SqlCommands (cmd) samt SQL-Befehl und Connection-Details fehlt, denn cmd setzt sich zusammen aus:


SqlConnection conn = new SqlConnection();
conn.ConnectionString = @"Data Source=.\SQLEXPRESS;" +
                                    @"AttachDbFilename=" + path + @"\" + db_name + @";" +
                                     "Integrated Security=True;" +
                                     "Connect Timeout=30;" +
                                     "User Instance=True";

//Command-Objekt
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = sql;

Theoretisch müsste ich das doch jetzt auch noch mit in die Methode DB_Update_DataGrid einbauen, richtig?
Das führt doch dazu, dass ich die komplett gleiche Methode wie zum Auslesen von den DataGrids habe... ich kann mir nicht vorstellen dass das so sein muss? Unterm Strich möchte ich doch nichts weiter als das bereits ausgelesene und abgeänderte DataTable zurückschreiben - updaten halt. Dafür muss ich den kompletten Quelltext nochmal in die Methode aufnehmen? Kann ich nicht irgendwie auf die vorherige Methode, die zum Auslesen und eintragen des DataGrids zurückgreifen?
Diese kleine Update-Funktion ärgert mich ziemlich
private Nachricht | Beiträge des Benutzers
p!lle
myCSharp.de - Member

Avatar #avatar-3556.jpg


Dabei seit:
Beiträge: 1053

beantworten | zitieren | melden

Beschäftige dich mal mit 'Scopes'.
private Nachricht | Beiträge des Benutzers
Coffeebean
myCSharp.de - Team

Avatar #avatar-3295.gif


Dabei seit:
Beiträge: 2461
Herkunft: Deutschland/Schweiz

beantworten | zitieren | melden

Zitat von Coffeebean
"da" ist der Klasse bekannt.

Somit kann jede Methode der Klasse auf "da" zugreifen. Greifst du drauf zu, bevor du es zugewiesen hast, knallts.

Konstruktor:

SqlDataAdapter da = new SqlDataAdapter();

Dann kannst du, ohne etwas zu übergeben, von einer Methode auf "da" zugreifen, da es ja in der Klasse (global) bekannt ist.

Siehe p!lles Hinweis hier Scopes
private Nachricht | Beiträge des Benutzers
nullbytes
myCSharp.de - Member



Dabei seit:
Beiträge: 18

Themenstarter:

beantworten | zitieren | melden

Zitat von Coffeebean
Zitat von Coffeebean
"da" ist der Klasse bekannt.

Somit kann jede Methode der Klasse auf "da" zugreifen. Greifst du drauf zu, bevor du es zugewiesen hast, knallts.

Okay, verstanden!
Zitat von Coffeebean
Konstruktor:

SqlDataAdapter da = new SqlDataAdapter();

Lösung sieht also wie folgt aus:

public void DB_Update_DataGrid(DataGrid datagrid_name, SqlDataAdapter da = new SqlDataAdapter(), DataTable dt = new SqlDataTable())
{
...
}

Geht nicht, da der Kompiler mir sagt:

Der Standardparameterwert für "da" muss eine Kompilierzeitkonstante sein

Habe ich ja noch nie gehört, darum fix recherchiert und das Problem wie folgt gelöst:

 public void DB_Update_DataGrid(DataGrid datagrid_name, SqlDataAdapter da = null, DataTable dt = null)
{
               da = new SqlDataAdapter();
                dt = new DataTable();

...
}

Geht auch nicht, weil immer noch der da = new SqlDataAdapter(cmd) fehlt und somit kommt es zu:
Fehler
Die SelectCommand-Eigenschaft wurde nicht initialisiert vor dem Aufruf von: 'Fill'."} System.Exception {System.InvalidOperationException}


Hmmm.. bringt es was der Klasse das cmd-Objekt samt Connection und SQL Anweisung der gesamten Klasse zur Verfügung zu stellen?

Dann kannst du, ohne etwas zu übergeben, von einer Methode auf "da" zugreifen, da es ja in der Klasse (global) bekannt ist.

Siehe p!lles Hinweis hier Scopes[/quote]
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4184

beantworten | zitieren | melden

Hallo zusammen,

kleine Berichtigung von Coffeebean's Beitrag:
Da es sich dann aber um eine Membervariable handeln muß, muß der Aufruf im Konstruktor dann natürlich so aussehen:


da = new SqlDataAdapter();
mit der Membervariablen


private SqlDataAdapter da;

Oder aber gleich den Member intialisieren:


class DBQuery
{
    private SqlDataAdapter da = new SqlDataAdapter();
}

@nullbytes: diese Kenntnisse sind elementar für die Programmierung...

Dein Ansatz mit der Übergabe der Parameter an die Methoden ist nicht so gut, da du dann von außen die Objekte übergeben müßtest, und sicherstellen, daß du bei der Fill- und Update-Methode immer die gleichen Objekte übergibst.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16148

beantworten | zitieren | melden

Sorry, wie befinden uns hier wirklich in den absoluten C# Grundlagen.
Wieso kein new() in Parameterübergaben definiert werden kann sollte logisch sein, wenn man verstanden hat, wie Parameter funktionieren. ;-)

Wie es übrigens korrekt wäre, das haben die anderen schon gesagt (im Konstruktor) - wie es richtiger geht hab ich gesagt (3-Schichten).
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Coffeebean
myCSharp.de - Team

Avatar #avatar-3295.gif


Dabei seit:
Beiträge: 2461
Herkunft: Deutschland/Schweiz

beantworten | zitieren | melden

Zitat von Th69
kleine Berichtigung von Coffeebean's Beitrag:
Da es sich dann aber um eine Membervariable handeln muß, muß der Aufruf im Konstruktor dann natürlich so aussehen:


da = new SqlDataAdapter();
mit der Membervariablen


private SqlDataAdapter da;

Absolut. Hatte ich übersehen, aber genau das meinte ich ja ;-) Danke!
private Nachricht | Beiträge des Benutzers
nullbytes
myCSharp.de - Member



Dabei seit:
Beiträge: 18

Themenstarter:

beantworten | zitieren | melden

Hallo Freunde,

auch wenn ich mit diesem Thread viel gelernt habe, dem Umgang mit dem Kompiler und was es mit diesem Objektverweis auf sich hat, möchte ich den Thread nochmal zum Leben erwecken, da ich es immer noch nicht geschafft habe die Funktionalität in eine separate Klasse auszulagern.

Ich möchte nach wie vor das Auslesen samt Füllen eines DataGrids aus einer Datenbank in eine Methode verpacken, sowie das Updaten dieser beiden Elemente.

Wenn ich diesen Code hier ganz normal im Namespace meines Hauptprogrammes unter der Main-Methode schreibe und ausführe, funktioniert alles wie es soll - die Funktionalität des Quelltextes an sich ist also erstmal gegeben:



        SqlDataAdapter da;
        SqlCommandBuilder cmdbl;
        DataTable dt;
        
       //Fenster wird geladen
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            try
            {
                //Connection-Objekt
                SqlConnection conn = new SqlConnection();
                conn.ConnectionString = @"Data Source=.\SQLEXPRESS;" +
                                        @"AttachDbFilename=" + path + @"\" + db_name + @";" +
                                          "Integrated Security=True;" +
                                          "Connect Timeout=30;" +
                                          "User Instance=True";

                //Command-Objekt
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                cmd.CommandText = sqlcommand;

                //DataAdapter
                da = new SqlDataAdapter(sqlcommand, conn);

                //DataTable
                dt = new DataTable();
                da.Fill(dt);

                dataGrid1.ItemsSource = dt.DefaultView;

                conn.Close();
            }

            finally
            {

            }

        }

        //Button Update
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                cmdbl = new SqlCommandBuilder(da);
                da.Update(dt);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + ex.StackTrace);
            }
        }

Nehme ich diesen Quelltext jetzt aber 1:1 und verpacke die Methode private void Window_Loaded() und private void Button_Click() separat in einer Methode in einer Klasse und rufe diese nun auf, klappt das Update nicht mehr - und ich weiß nicht warum.

Coffeebean war so nett und hat mir gesagt, ich solle DataAdapter & DataTable im Konstruktor erzeugen... trotzdem klappt das alles nicht so wie ich will.

Ich habe jetzt ewig hin und her probiert, mich durch verschiedene Fehlermeldungen gekämpft (mein Connection-Objekt wirft mir in der Update-Methode immer diverse Fehlermeldungen raus) und habe jetzt einen Stand, der ohne Fehlermeldungen zum Programmstart führt, durchläuft aber trotzdem nicht funktioniert... ich bin mittlerweile so verwirrt, dass ich überhaupt keinen Plan mehr habe was hier in meinem Quelltext überhaupt noch passiert und überhaupt von nöten ist. Gleichzeitig verstehe ich nicht, wieso ich so viel umändern muss, wenn ich den Quelltext einfach nur vom Hauptprogramm in eine Klasse umsiedel - die Regeln in Bezug auf Namensräume, Scopes und Funktionalität bleiben die gleichen...

Könnte mir bitte einer nochmal beim Aufräumen und umsetzen helfen? X(

Meine jetzige Klasse:

namespace Test_DB
{
    internal class DBQuery
    {
       private SqlConnection conn = new SqlConnection();
        private SqlDataAdapter da = new SqlDataAdapter();
        private SqlCommandBuilder cmdbl;
        private DataTable dt = new DataTable();
        
        string path = @"bla";
        string db_name = "bla";
        string sqlcommand = "bla";

        // DataGrid füllen
        public void DB_DataGrid_Fill(DataGrid dataGrid)
        {

            try
            {
                //Connection-Objekt
                //SqlConnection conn = new SqlConnection();
                conn.ConnectionString = @"Data Source=.\SQLEXPRESS;" +
                                        @"AttachDbFilename=" + path + @"\" + db_name + @";" +
                                         "Integrated Security=True;" +
                                         "Connect Timeout=30;" +
                                         "User Instance=True";

                

                //Command-Objekt
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                cmd.CommandText = sqlcommand;

                // ----------------------------------

                //DataAdapter da
                da = new SqlDataAdapter(cmd);
                
                //DataTable dt
                dt = new DataTable();

                //Fill
                da.Fill(dt);
                dataGrid.ItemsSource = dt.DefaultView;
                da.Update(dt);

                conn.Close();
            }
            finally
            {
                
            }
        }

        //DataGrid Updaten
        public void DB_DataGrid_Update()
        {
            //Connection-Objekt - steht hier bloß weil sonst der Kompiler meckert...
            //SqlConnection conn = new SqlConnection();
            conn.ConnectionString = @"Data Source=.\SQLEXPRESS;" +
                                    @"AttachDbFilename=" + path + @"\" + db_name + @";" +
                                     "Integrated Security=True;" +
                                     "Connect Timeout=30;" +
                                     "User Instance=True";
                        
            //Command-Objekt
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            cmd.CommandText = sqlcommand;

            da = new SqlDataAdapter(cmd); 
            dt = new DataTable();

            try
            {
                if (da != null)
                {
                    cmdbl = new SqlCommandBuilder(da);
                    da.Fill(dt);
                    da.Update(dt);

                    Console.Beep(1000, 750); //nur zum schauen ob Quellcode durchlaufen wird
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message + ex.StackTrace);
            }
        }
    }
}
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5989
Herkunft: Leipzig

beantworten | zitieren | melden

Hi nullbytes,
Zitat von nullbytes
Ich habe jetzt ewig hin und her probiert, mich durch verschiedene Fehlermeldungen gekämpft (mein Connection-Objekt wirft mir in der Update-Methode immer diverse Fehlermeldungen raus) und habe jetzt einen Stand, der ohne Fehlermeldungen zum Programmstart führt, durchläuft aber trotzdem nicht funktioniert... ich bin mittlerweile so verwirrt, dass ich überhaupt keinen Plan mehr habe was hier in meinem Quelltext überhaupt noch passiert und überhaupt von nöten ist.

Wenn du schon keinen Plan mehr davon hast, was dein Programm macht, wie sollen wir dir dann dabei helfen? Fehlermeldungen sind dokumentiert und haben eine Exception-Beschreibung, d.h. du kannst nachschauen, was das Problem ist, und woran es liegen könnte. Um Fehler aufzuspüren, kannst du den Debugger oder Unit-Tests verwenden. Die entsprechenden Stichworte und Links sind ja schon gepostet worden.

Wenn du mit deiner Aufgabe so überfordert bist, wie es den Anschein erweckt, dann solltest du dir evtl. erst einmal eine weniger anspruchsvolle Aufgabe suchen.

Nicht erwünscht ist aber das Posten von Quellcode mit der Aufforderung, funktioniert nicht, helft mir mal. Hier bitte ich dich, zukünftig unseren [Hinweis] Wie poste ich richtig? zu beachten, besonders die Punkte 1.1, 1.2, 4, 4.2 und 5.

Christian
Weeks of programming can save you hours of planning
private Nachricht | Beiträge des Benutzers