Autor Beitrag
peter876
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Do 04.10.12 14:08 
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
private void UpdateDataGrid()
        {
            string ConString = "Server=localhost;Database=data;Uid=root;Pwd=;";
            string CmdString = string.Empty;
            using (MySqlConnection con = new MySqlConnection(ConString))
            {
                CmdString = "SELECT NName,Name,Street,EMail,MobileNo FROM Phonebook";
                MySqlCommand cmd = new MySqlCommand(CmdString, con);
                MySqlDataAdapter sda = new MySqlDataAdapter(cmd);
                DataTable dt = new DataTable("Phonebook");
                sda.Update(dt);
                datagridview1.ItemsSource = dt.DefaultView;
            }
        }

Ich will mein Datagrid in meinen windowsfenster bearbeiten und auch speichern habe bis jetz das hier zusammen. aber mit den befehl sda.Ipdate(dt) funktioniert es leider nicht es wird kein datensatz gespeichert oder geändert was mach ich falsch ?

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 04.10.12 14:35 
Wenn du Daten aus der Quelle(Datenbank) in die DataTable bekommen willst brauchst du die Fill Methode nicht Update. Update ist um geänderte Daten in die Datenbank zurückzuschreiben. Da du einen neue (und damit leere) DataTable erzeugt hast gibt es (noch) nix upzudaten.
peter876 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Do 04.10.12 14:37 
das füllen klappt aber das update nicht kann also daten in der tabelle ändern also im grid aber sie werden nicht auf die datenbank übertragen
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 04.10.12 14:43 
Und nachdem du die Daten im Grid geändert hast kannst du die auch per Update zurückschreiben. Dein Code zeigt aber denn Aufruf von Update direkt nach dem erstellen der DataTable und nicht nach dem Bearbeiten im Grid. Dein gezeigter Code kann die Daten zum ändern auch nicht ins Grid gebracht haben der Teil fehlt bzw. ist falsch.
peter876 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Do 04.10.12 14:51 
der füller
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
private void FillDataGrid()
        {
            string ConString = "Server=localhost;Database=data;Uid=root;Pwd=;";
            string CmdString = string.Empty;
            using (MySqlConnection con = new MySqlConnection(ConString))
            {
                CmdString = "SELECT NName,Name,Street,EMail,MobileNo FROM Phonebook";
                MySqlCommand cmd = new MySqlCommand(CmdString, con);
                MySqlDataAdapter sda = new MySqlDataAdapter(cmd);
                DataTable dt = new DataTable("Phonebook");
                sda.Fill(dt);
                datagridview1.ItemsSource = dt.DefaultView;                
            }
        }

Und der zum speichern wird per button ausgelöst
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
private void UpdateDataGrid()
        {
            string ConString = "Server=localhost;Database=data;Uid=root;Pwd=;";
            string CmdString = string.Empty;
            using (MySqlConnection con = new MySqlConnection(ConString))
            {
                CmdString = "SELECT NName,Name,Street,EMail,MobileNo FROM Phonebook";
                MySqlCommand cmd = new MySqlCommand(CmdString, con);
                MySqlDataAdapter sda = new MySqlDataAdapter(cmd);
                DataTable dt = new DataTable("Phonebook");
              
                sda.Update(dt);

                sda.Fill(dt);

                datagridview1.ItemsSource = dt.DefaultView;
            }
        }


problem ist immernoch das es nicht gespeichert wird :(
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4795
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 04.10.12 15:06 
Hallo peter876,

es reicht
ausblenden C#-Quelltext
1:
2:
3:
4:
private void UpdateDataGrid()
{
   sqlDataAdapter.Update(dataTable);
}

d.h. du mußt nur die beiden Variablen sda und dt in deiner FillDataGrid()-Methode zu Klassenvariablen (Membern) machen (und daher habe ich denen bessere, lesbarere Namen gegeben ;-)).
peter876 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Do 04.10.12 15:10 
das geht so leider nicht da sind ja dann sda in meinen fall und dt nicht mehr deklariert ?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 04.10.12 15:43 
Deklariert sind die dann aber die sind eventuell dann nicht initialisiert. Das kannst du im Konstruktor oder sonst wo am Anfang wenn die Klasse/Form erzeugt wird machen.

Alternativ würde ich dir empfehlen die beiden Methoden unabhängig von der GUI zu machen. Das wird dir die Sache in Zukunft einfacher machen.
Dazu die beiden Methoden in eine neue von der Form unabhängige Klasse verschieben und die Signatur der beiden Methoden so ändern das FillDataGrid eine DataTable zurückgibt und UpdateDataGrid eine DataTable entgegen nimmt.

Dann kannst du später im Code der Form einfach ein

ausblenden C#-Quelltext
1:
2:
3:
datagridview1.ItemsSource = MeineNeueKlasse.FillDataGrid();
//bzw. ein 
MeineNeueKlasse UpdateDataGrid(datagridview1.ItemsSource as DataTable);


Warum ist in der UpdateDataGrid Methode bei dir nach dem Update Aufruf noch ein Fill?
peter876 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Do 04.10.12 16:47 
Kannste das mal bitte komplett posten sonst versteht das ein anfänger wie ich nicht, das mit den update und fill war nur ein fehler von mit beim kopieren :).
peter876 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Fr 05.10.12 11:44 
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using MySql.Data.MySqlClient;
using System.ComponentModel;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
using System.Drawing;

namespace WpfApplication10
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public class Globals
        {
            public static string Connection = "Server=localhost;Database=data;Uid=root;Pwd=;";
        }
        public MainWindow()
        {
            InitializeComponent();
            FillDataGrid();
        }
        private void FillDataGrid()
        {
            string ConString = Globals.Connection;
            string CmdString = string.Empty;
            using (MySqlConnection con = new MySqlConnection(ConString))
            {
                CmdString = "SELECT NName,Name,Street,EMail,MobileNo FROM Phonebook";
                MySqlCommand cmd = new MySqlCommand(CmdString, con);
                MySqlDataAdapter sda = new MySqlDataAdapter(cmd);
                DataTable dt = new DataTable("Phonebook");
                sda.Fill(dt);
                datagridview1.ItemsSource = dt.DefaultView;
            }
        }
        private void UpdateDataGrid()
        {
            string ConString = Globals.Connection;
            string CmdString = string.Empty;
            using (MySqlConnection con = new MySqlConnection(ConString))
            {
                CmdString = "SELECT NName,Name,Street,EMail,MobileNo FROM Phonebook";
                MySqlCommand cmd = new MySqlCommand(CmdString, con);
                MySqlDataAdapter sda = new MySqlDataAdapter(cmd);
                DataTable dt = new DataTable("Phonebook");
                datagridview1.ItemsSource = dt.DefaultView;
                sda.Update(dt);
                MessageBox.Show("huhi");
            }
        }
        private void Button_Click(Object sender, EventArgs e)
        {

            UpdateDataGrid();

        }


    }
}


Noch ma als bsp. wie ich es jetz schnell gebaut habe was noch nicht funktioniert :/
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4795
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 05.10.12 12:32 
Hallo peter876,

hast du meinen Hinweis nicht verstanden?
Also
1. Anlegen der Membervariablen:
ausblenden C#-Quelltext
1:
2:
private MySqlDataAdapter sqlDataAdapter;
private DataTable dataTable;

2. Benutzen dieser Variablen (Initialisieren und Verwenden)
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
private void FillDataGrid()
{
     string ConString = "Server=localhost;Database=data;Uid=root;Pwd=;";
     string CmdString = string.Empty;
     using (MySqlConnection con = new MySqlConnection(ConString))
     {
         CmdString = "SELECT NName,Name,Street,EMail,MobileNo FROM Phonebook";
         MySqlCommand cmd = new MySqlCommand(CmdString, con);
         sqlDataAdapter = new MySqlDataAdapter(cmd); // <--
         dataTable = new DataTable("Phonebook"); // <--
         sqlDataAdapter.Fill(dataTable);
         datagridview1.ItemsSource = dataTable.DefaultView;
     }
}          

private void UpdateDataGrid()
{
   sqlDataAdapter.Update(dataTable);
}


Gerade für WPF sollte man jedoch MVVM verwenden, d.h. Trennung von View, ViewModel und Logik (sowie Datenbankzugriff).
Für dich als Anfänger würde ich dir eher WinForms empfehlen.
peter876 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Fr 05.10.12 12:41 
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
using...

namespace WpfApplication10
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public class Globals
        {
            public static string Connection = "Server=localhost;Database=data;Uid=root;Pwd=;";
        }
        public MainWindow()
        {
            InitializeComponent();
            FillDataGrid();
        }

        private MySqlDataAdapter sqlDataAdapter;
        private DataTable dataTable;
        private void FillDataGrid()
        {
            string ConString = "Server=localhost;Database=data;Uid=root;Pwd=;";
            string CmdString = string.Empty;
            using (MySqlConnection con = new MySqlConnection(ConString))
            {
                CmdString = "SELECT NName,Name,Street,EMail,MobileNo FROM Phonebook";
                MySqlCommand cmd = new MySqlCommand(CmdString, con);
                sqlDataAdapter = new MySqlDataAdapter(cmd); // <--
                dataTable = new DataTable("Phonebook"); // <--
                sqlDataAdapter.Fill(dataTable);
                datagridview1.ItemsSource = dataTable.DefaultView;
            }
        }

        private void UpdateDataGrid()
        {
            sqlDataAdapter.Update(dataTable);
        }



        private void Button_Click(Object sender, EventArgs e)
        {

            UpdateDataGrid();

        }
    }
}


wenn ich auf den button drücke = kein fehler
wenn ich etwas ändere in der tabelle und dann auf den button drücke = fehler
aber ich hab das schon mal mit den variablen verstanden danke

Der Fehler:
Zusätzliche Informationen: Für ein Update ist ein gültiger UpdateCommand erforderlich, wenn eine DataRow-Auflistung mit modifizierten Zeilen weitergegeben wird.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 05.10.12 12:54 
Vermutlich enthält dein SQL nicht den Primärschlüssel der Phonebook Tabelle. Die automatisch generierten Insert, Update, Delete Commands benötigen den. Also entweder Prümärschlüssel definieren oder selbst die entsprechenden Update Commands schreiben und dem SQLDataAdapter zuweisen.
peter876 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Fr 05.10.12 12:59 
Hab mich etwas belesen und meine SQL Tabelle hat nun auch Primary Keys die zugeordnet werden.
Aber es tritt der gleiche fehler auf?
peter876 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Sa 06.10.12 21:15 
*push* niemand eine Idee?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4795
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 07.10.12 10:57 
Hast du denn den PrimaryKey (PK) auch in dein SELECT-Statement aufgenommen?
ausblenden C#-Quelltext
1:
"SELECT Id, NName,Name, ..."					

Id wäre hier z.B. der Name deiner PK-Spalte.
peter876 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Fr 12.10.12 08:58 
Ja mein PK ist in der SELECT mit drinne



Eine nicht behandelte Ausnahme des Typs "System.InvalidOperationException" ist in System.Data.dll aufgetreten.

Zusätzliche Informationen: Für ein Update ist ein gültiger UpdateCommand erforderlich, wenn eine DataRow-Auflistung mit modifizierten Zeilen weitergegeben wird.