Autor Beitrag
Dresha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Win XP Prof
C# (VS08 + NET3.5), jdk6
BeitragVerfasst: Sa 06.12.08 15:58 
Ich hab ein Dataset und möchte gerne mit Adapter.Update(Dataset, Tabellenname) das Update zurück schreiben. Lesen klappt nur das zurück schreiben nicht. Ich bekomme da leider keine Fehlermeldung. So das ich den Fehler finden könnte aber nach einem erneuten auslesen seh ich das noch die alten Werte in der Tabelle sind.

Hier der ich hoffe relevante ausschnitt vom code.

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:
    class mysqlschnitt
    {
        private const string myConnectionString = "#######################";
        private MySqlConnection connection = null;
        private MySqlCommand command = null;

        private MySqlDataAdapter MyAdapter = null;

        private const string tableName = "products";

        public mysqlschnitt(){
            connection = new MySqlConnection(myConnectionString);
            command = connection.CreateCommand();
            }

        public string mysqlconnopen(){
            try
            {
                connection.Open();
            }
            catch (Exception e)
            {
                return (e.ToString());
            }
            return "Verbindung wurde erfolgreich geöffnet.";
        }

        public string mysqlconclose()
        {
            try
            {
                if(connection != null)
                    connection.Close();
            }
            catch ( Exception e){
                return(e.ToString());
            }
            return "Verbindung wurde erfolgreich geschlossen.";
        }

        public string queryStringBuilder(string Artikelnummer, int Anzahl)
        {
            return null;
        }

        public DataSet GetUpdateTable()
        {
            MyAdapter = new MySqlDataAdapter("SELECT products_quantity,products_model FROM products", connection);
            DataSet MyDataSet = new DataSet();

            MyAdapter.Fill(MyDataSet,tableName);

            return MyDataSet;

        }

        public void updateArtikel(DataSet myDataSet)
        {
                MyAdapter.Update(myDataSet, tableName);

        }
}
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Sa 06.12.08 16:18 
Hallo,

zum Update benötigt der DbDataAdapter passende Insert-, Update- und Delete-Commands. In vielen Fällen kann er sie sich aus dem SelectCommand selbst erzeugen; aber Voraussetzung ist unabdingbar, dass die DataTable einen PrimaryKey hat und dieser im Select-Befehl enthalten ist! Das scheint hier zu fehlen.

Außerdem gefällt mir der Zusammenhang der MySql-Objekte nicht. Einer der Grundgedanken von ADO.NET ist, dass eine DbConnection nur kurzfristig erstellt und geöffnet wird und nach Benutzung sofort wieder geschlossen wird; gleiches gilt für den DbDataAdapter. Einführungen findest Du z.B. in OpenBook Visual C# Kap.25 ff. oder Datenbanken-HowTo.

Jürgen
Dresha Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Win XP Prof
C# (VS08 + NET3.5), jdk6
BeitragVerfasst: Sa 06.12.08 16:20 
Danke, ich schau mal ob mir die links weiter helfen. Und keine sorge das ist bisher nur mein Testprogramm.
Dresha Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Win XP Prof
C# (VS08 + NET3.5), jdk6
BeitragVerfasst: Mo 08.12.08 18:02 
Selbst nach eingehender Studie der Lektüre und auch selbst generieren der SQL Update Funktion geht es immer noch nicht. Solangsam gehen mir die Ideen langsam aus.

Hier meine Dunktion die die Update Funktion baut:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
        public MySqlCommand CreateUpdateCommand()
        {
            string strSQL = "UPDATE products " +
                            "SET products_quantity=@Menge " +
                            "WHERE products_id=@ID";

            MySqlCommand uc = new MySqlCommand(strSQL,connection);

            // die Parameter der Parameters-Auflistung hinzufügen 
            MySqlParameterCollection col = uc.Parameters;
            col.Add("@ID", MySqlDbType.Int32, 8"products_id");
            col.Add("@Menge", MySqlDbType.Int32, 8"products_quantitiy");
            MySqlParameter param = new MySqlParameter();
            param.SourceVersion = DataRowVersion.Original; 

            return uc;
        }
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mo 08.12.08 19:16 
Es geht deutlich einfacher:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
MySqlCommand uc = new MySqlCommand(strSQL,connection);

// die Parameter der Parameters-Auflistung hinzufügen 
uc.Parameters.AddWithValue("@ID", products_id);
uc.Parameters.AddWithValue("@Menge", products_quantity);

Anders als bei Deinem Aufruf über eine eigene Methode musst Du natürlich dafür sorgen, dass die Inhalte von products_id und products_quantity an dieser Stelle bekannt sind.

Inwieweit die SourceVersion überhaupt benötigt wird, kann ich nicht sagen. Im Falle eines Falles darfst Du dann aber nicht einen neuen Parameter erstellen (dieses Vorgehen mit unmotiviertem new bezeichne ich vorzugsweise als Quatsch), den Du nur für diesen Zweck benutzt und überhaupt nicht mit der Collection in Verbindung bringst. Wenn überhaupt, dann geht es auch direkt:
ausblenden C#-Quelltext
1:
2:
3:
4:
uc.Parameters.AddWithValue("@ID", products_id).SourceVersion 
   = DataRowVersion.Current;
uc.Parameters.AddWithValue("@Menge", products_quantity).SourceVersion 
   = DataRowVersion.Current;

Wenn Du Änderungen abspeichern willst, ist doch die Verwendung der Ursprungsversion äußerst sinnlos; stattdessen brauchst Du doch die aktuelle Version!

Jürgen
Dresha Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Win XP Prof
C# (VS08 + NET3.5), jdk6
BeitragVerfasst: Mo 08.12.08 19:53 
Ich hab das mit dem Current geänder und beide Varianten mal aus probiert aber weder noch bringt mir ein update der MySQL Tabelle.

Ansonsten hab ich mal versucht "GetUpdateCommand" zu nutzen vom MySQL Connector, der gibt mir aber nur den Fehler zurück das die

Zitat:
Dynamische SQL-Generierung wird für einen SelectCommand, der keine Basistabelleninformationen zurückgibt, nicht unterstützt.


Primary Key hab ich auch gesetzt

ausblenden C#-Quelltext
1:
2:
3:
            DataColumn[] PrimaryKeyColumn = new DataColumn[1];
            PrimaryKeyColumn[0] = MyDataSet.Tables[0].Columns["products_id"];
            MyDataSet.Tables[0].PrimaryKey = PrimaryKeyColumn;
raiguen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 374

WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
BeitragVerfasst: Fr 19.12.08 00:42 
user profile iconDresha hat folgendes geschrieben Zum zitierten Posting springen:
Selbst nach eingehender Studie der Lektüre ...

*räusper* diese erzählen auch nur die allgemeinen Syntaxen etc und nicht die speziellen Feinheiten... Mit Sicherheit hast Du Dir NICHT das Manual zu MySQL angeschaut :roll:
Warum? Dann wäre Dir aufgefallen, dass das hier NICHT funktionieren KANN:
ausblenden SQL-Anweisung
1:
2:
3:
            string strSQL = "UPDATE products " +
                            "SET products_quantity=@Menge " +
                            "WHERE products_id=@ID";
-> WEIL: Parameterbezeichnungen in MySQL werden üblicherweise mit einen ? gekennzeichnet (die Verwendung von @ ist beim MSSQL-Server die richtige Schreibweise).

MySQL 5.1 Referenzhandbuch hat folgendes geschrieben:
...In dieser Anweisung können Fragezeichen (‘?’) als Parameterkennzeichen verwendet werden: Sie geben an, wo bei der späteren Ausführung der Anweisung Datenwerte eingebunden werden. Fragezeichen sollten auch dann nicht in Anführungszeichen gesetzt werden, wenn Sie beabsichtigen, sie an String-Werte anzubinden. Parameterkennzeichen dürfen nur an Stellen verwendet werden, an denen Datenwerte eingefügt werden sollen, nicht jedoch für SQL-Schlüsselwörter, Bezeichner usw. ...
Quelle zum weiteren Studium.
Somit sollte- NEIN MUSS -dein SQL-Statement so heissen:
ausblenden SQL-Anweisung
1:
2:
3:
            string strSQL = "UPDATE products " +
                            "SET products_quantity=?Menge " +
                            "WHERE products_id=?ID";
Selbstverständlich sind alle Codezeilen, in denen der Parameter namentlich erwähnt wird, entsprechend umzustellen ;)

Gruss Rainer