Entwickler-Ecke
Datenbanken (inkl. ADO.NET) - Problem mit Update Dataset und in SQL Datenbank
Dresha - Sa 06.12.08 15:58
Titel: Problem mit Update Dataset und in SQL Datenbank
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.
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 - 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# [
http://openbook.galileocomputing.de/visual_csharp/] Kap.25 ff. oder
Datenbanken-HowTo [
http://www.seven-c.de/files/datenbankenhowto.htm].
Jürgen
Dresha - 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 - 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:
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);
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 - Mo 08.12.08 19:16
Es geht deutlich einfacher:
C#-Quelltext
1: 2: 3: 4: 5:
| MySqlCommand uc = new MySqlCommand(strSQL,connection);
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:
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 - 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
C#-Quelltext
1: 2: 3:
| DataColumn[] PrimaryKeyColumn = new DataColumn[1]; PrimaryKeyColumn[0] = MyDataSet.Tables[0].Columns["products_id"]; MyDataSet.Tables[0].PrimaryKey = PrimaryKeyColumn; |
raiguen - Fr 19.12.08 00:42
Dresha hat folgendes geschrieben : |
| 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:
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 [
http://dev.mysql.com/doc/refman/5.1/de/sqlps.html].
Somit sollte- NEIN MUSS -dein SQL-Statement so heissen:
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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!