Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - Datenbank, Update mehrerer Zeilen.


Acorwyn - Do 31.03.11 10:27
Titel: Datenbank, Update mehrerer Zeilen.
Hey,
Ich habe eine Anwendung erstellt die Daten in einem XamDataGrid anzeigt und nun will nun die Daten ändern. Ich hab es so gemacht das er alle Daten letzendlich in mehreren textBoxen ausgibt und ich über einen Knopf alles was geändert wurde, neu einträgt in der Datenbank.
Das alles habe ich schon hinbekommen, ich möchte es jetz blos so machen das es nicht sooo voll ist also alles mit einer Funktion.
Hier ist nochmal der Quellcode für den Button der alles ändert.. also ein Ausschnitt:


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:
private void button3_Click(object sender, RoutedEventArgs e)
        {
            //ID tbladress
            using (OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Users\hmprak\Documents\prakdb1(backup).accdb; Mode=12"))
            {
                conn.Open();
                using (OleDbCommand cmd = new OleDbCommand("UPDATE tbladress SET fldid = @newValue WHERE fldid = @id", conn))
                {
                    cmd.Parameters.AddWithValue("@newValue", textBox1.Text);
                    cmd.Parameters.AddWithValue("@id", String.Format("{1}{0}{2}", mStrAddressId, "{""}"));
                    cmd.ExecuteNonQuery();
                }
            }
            //Vorname tbladress
            using (OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Users\hmprak\Documents\prakdb1(backup).accdb; Mode=12"))
            {
                conn.Open();
                using (OleDbCommand cmd = new OleDbCommand("UPDATE tbladress SET fldname01 = @newValue WHERE fldid = @id", conn))
                {
                    cmd.Parameters.AddWithValue("@newValue", textBox2.Text);
                    cmd.Parameters.AddWithValue("@id", String.Format("{1}{0}{2}", mStrAddressId, "{""}"));
                    cmd.ExecuteNonQuery();
                }
            }
            //Zweitname tbladress
            using (OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Users\hmprak\Documents\prakdb1(backup).accdb; Mode=12"))
            {
                conn.Open();
                using (OleDbCommand cmd = new OleDbCommand("UPDATE tbladress SET fldname02 = @newValue WHERE fldid = @id", conn))
                {
                    cmd.Parameters.AddWithValue("@newValue", textBox3.Text);
                    cmd.Parameters.AddWithValue("id", String.Format("{1}{0}{2}", mStrAddressId, "{""}"));
                    cmd.ExecuteNonQuery();
                }
            }
            //Nachname tbladress
            using (OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Users\hmprak\Documents\prakdb1(backup).accdb; Mode=12"))
            {
                conn.Open();
                using (OleDbCommand cmd = new OleDbCommand("UPDATE tbladress SET fldname03 = @newValue WHERE fldid = @id", conn))
                {
                    cmd.Parameters.AddWithValue("@newValue", textBox4.Text);
                    cmd.Parameters.AddWithValue("@oldValue", String.Format("{1}{0}{2}", mStrAddressId, "{""}"));
                    cmd.ExecuteNonQuery();
                }
            }
            //Straße tbladress
            using (OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Users\hmprak\Documents\prakdb1(backup).accdb; Mode=12"))
            {
                conn.Open();
                using (OleDbCommand cmd = new OleDbCommand("UPDATE tbladress SET fldstraße = @newValue WHERE fldid = @id", conn))
                {
                    cmd.Parameters.AddWithValue("@newValue", textBox5.Text);
                    cmd.Parameters.AddWithValue("@oldValue", String.Format("{1}{0}{2}", mStrAddressId, "{""}"));
                    cmd.ExecuteNonQuery();
                }


So geht das noch lange weiter, und das ist nun einfach zu viel da ich weiß das man das alles auch mit einer Funktion machen kann. Ich weiß blos nicht wie :(
Bitte helft mir :)
Danke !


Moderiert von user profile iconChristian S.: Topic aus WPF / Silverlight verschoben am Do 31.03.2011 um 10:36


Th69 - Do 31.03.11 12:37

Hallo,

zum einen brauchst du ja nicht immer wieder die DBConnection neu zu erstellen, d.h. du könntest einfach die Commands in einen Connection-Block setzen.
Und zum anderen beschäftige dich mal mit dem Thema "Data Binding", z.B.
How to: Bind to an ADO.NET Data Source [http://msdn.microsoft.com/en-us/library/ms752057.aspx]
Data Binding Overview [http://msdn.microsoft.com/en-us/library/ms752347.aspx]

Einfach die Daten in eine DataTable laden (mittels eines DbDataAdapters) und dann mittels der Methode dataAdapter.Update() die (geänderten) Daten wieder an die Datenbank übermitteln.
s.a. DataSets, DataTables und DataViews (ADO.NET) [http://msdn.microsoft.com/de-de/library/ss7fbaez.aspx]


Acorwyn - Do 31.03.11 12:43

Also meinst du das jetz beispielsweise so? :


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:
private void button3_Click(object sender, RoutedEventArgs e)
        {
            //ID tbladress
            using (OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Users\hmprak\Documents\prakdb1(backup).accdb; Mode=12"))
            {
                conn.Open();
                using (OleDbCommand cmd = new OleDbCommand("UPDATE tbladress SET fldid = @newValue WHERE fldid = @id", conn))
                {
                    cmd.Parameters.AddWithValue("@newValue", textBox1.Text);
                    cmd.Parameters.AddWithValue("@id", String.Format("{1}{0}{2}", mStrAddressId, "{""}"));
                }
            }
                using (OleDbCommand cmd = new OleDbCommand("UPDATE tbladress SET fldname01 = @newValue WHERE fldid = @id", conn))
                {
                    cmd.Parameters.AddWithValue("@newValue", textBox2.Text);
                    cmd.Parameters.AddWithValue("@id", String.Format("{1}{0}{2}", mStrAddressId, "{""}"));
                }
            }
                using (OleDbCommand cmd = new OleDbCommand("UPDATE tbladress SET fldname02 = @newValue WHERE fldid = @id", conn))
                {
                    cmd.Parameters.AddWithValue("@newValue", textBox3.Text);
                    cmd.Parameters.AddWithValue("id", String.Format("{1}{0}{2}", mStrAddressId, "{""}"));
                }
            }
                using (OleDbCommand cmd = new OleDbCommand("UPDATE tbladress SET fldname03 = @newValue WHERE fldid = @id", conn))
                {
                    cmd.Parameters.AddWithValue("@newValue", textBox4.Text);
                    cmd.Parameters.AddWithValue("@oldValue", String.Format("{1}{0}{2}", mStrAddressId, "{""}"));
                }
            }


Das wäre doch jetz in einem Block oder versteh ich was falsch ? :D
tut mir leid wegen den doofen fragen ich bin ziemlich neu ;)


Th69 - Do 31.03.11 13:07

Hallo,

du hast aber noch einige "}" zu viel drin...
(dann müssen nun aber die DBCommand-Variablen jeweils unterschiedlich heißen und das ExecuteNonQuery fehlt natürlich...)

Da du aber sowieso alles in eine Tabelle (bzw. sogar eine Zeile) wieder wegschreiben willst, reicht natürlich auch ein DbCommand:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
using (OleDbCommand cmd = new OleDbCommand("UPDATE tbladress SET fldid = @newId, fldname01 = @newName, fldname02 = @newForeName" + /*, ... */ " WHERE fldid = @id", conn))
{
    cmd.Parameters.AddWithValue("@newId", textBox1.Text);
    cmd.Parameters.AddWithValue("@newName", textBox2.Text);
    cmd.Parameters.AddWithValue("@newForeName", textBox3.Text);
    /* ... */
    cmd.Parameters.AddWithValue("@id", String.Format("{1}{0}{2}", mStrAddressId, "{""}")); // <-- sieht deine Id wirklich so aus: {id} ???
    cmd.ExecuteNonQuery();
}


Aber wie gesagt "Data Binding" ist der bessere (und einfachere Weg)!
Steht ja auch als Feature beim XamDataGrid: http://www.infragistics.com/dotnet/netadvantage/wpf/xamdatagrid.aspx#Overview ;-)


Acorwyn - Do 31.03.11 13:24

Oke aber so wie du das geschrieben hast läuft es perfekt :)
ich danke dir !!