Entwickler-Ecke
Datenbanken (inkl. ADO.NET) - Kein Update bei UPDATE mit Sql-/OleDbParameter
raziel - Di 16.09.08 07:15
Titel: Kein Update bei UPDATE mit Sql-/OleDbParameter
Guten Morgen :gaehn:,
ich hab ein kleines Problem mit OleDbParameter[meta]SqlParameter[/meta]. Und zwar geht es um folgende Tabelle:
Quelltext
1: 2: 3:
| Spalte1 Spalte2 X 2 Y 5 |
X und Y sollen bleiben, wo sie sind und die beiden Zahlen sollen vertauscht werden. So funktioniert das Ganze wunderprächtig, ist aber natürlich weniger optimal mangels OleDbParameter[meta]SqlParameter[/meta]:
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:
| OleDbTransaction ta = connection.BeginTransaction(); try { sql = "UPDATE Abnahmeprotokollvorlagen " + "SET Zeile=" + line2 + " " + "WHERE TypID=" + machinetype + " AND PunktID=" + item1;
this.Update(sql, new object[]{"@TypeID", DbType.Int32, machinetype, "@PointID", DbType.Int32, item1, "@Line", DbType.Int32, line2}, ta);
sql = "UPDATE Abnahmeprotokollvorlagen " + "SET Zeile=" + line1 + " " + "WHERE PunktID=" + item2 + " AND TypID=" + machinetype; this.Update(sql, new object[]{"@TypeID2", DbType.Int32, machinetype, "@PointID2", DbType.Int32, item2, "@Line2", DbType.Int32, line1}, ta);
ta.Commit(); } |
Die
new object [] {...}-Parameter können getrost ignoriert werden, die sind da nur drin, um Tipparbeit zu sparen ;)
Probiert ich das Ganze mit SQL-Parametern, funktioniert das nicht mehr:
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:
| OleDbTransaction ta = connection.BeginTransaction(); try { sql = "UPDATE Abnahmeprotokollvorlagen " + "SET Zeile=@Line " + "WHERE TypID=@TypeID AND PunktID=@PointID";
this.Update(sql, new object[]{"@TypeID", DbType.Int32, machinetype, "@PointID", DbType.Int32, item1, "@Line", DbType.Int32, line2}, ta);
this.Update(sql, new object[]{"@TypeID", DbType.Int32, machinetype, "@PointID", DbType.Int32, item2, "@Line", DbType.Int32, line1}, ta);
ta.Commit(); } |
Wobei
this.Update(string sql, object [] parameters, OleDbTransaction[meta]SqlTransaction[/meta] ta); eine Methode ist, die einfach nur den Datenbankaufruf ausführt, der ja auch bei anderen Updates durchaus funktioniert - nur eben hier nicht.
Sieht einer, woran das liegen könnte? Es tritt keine Exception auf, das ganze geht ganz regulär durch, auch
ta.Commit() wird ausgeführt und es gibt keinen
Rollback() :? Notfalls könnte man das ja so lassen (was kann bei
int-Werten schon groß an SQL-Injections schiefgehen? :lol:).
Danke schonmal,
Gruß,
raziel
raziel - Di 16.09.08 11:12
Ich fürchte, ich bin grad selbst auf die Lösung des Problems gestoßen.
Kann es sein, dass beim Hinzufügen der OleDbParameter[meta]SqlParameter[/meta] die Reihenfolge beachtet werden muss? Weil nachdem ich das umgestellt habe, gehts jetzt :shock: Was ich ziemlich erstaunlich finde :o
Gruß,
raziel
JüTho - Di 16.09.08 13:06
raziel hat folgendes geschrieben: |
Kann es sein, dass beim Hinzufügen der OleDbParameter[meta]SqlParameter[/meta] die Reihenfolge beachtet werden muss? Weil nachdem ich das umgestellt habe, gehts jetzt :shock: Was ich ziemlich erstaunlich finde :o |
So ist es:
SDK-Doku/MSDN hat folgendes geschrieben: |
OleDbParameter-Klasse Hinweise
Anstelle benannter Parameter verwendet der OLE DB-.NET Framework-Datenanbieter mit einem Fragezeichen (?) markierte Positionsparameter. |
Das letzte Wort macht deutlich, dass es auf die Reihenfolge (= Position) ankommt.
Jürgen
raziel - Di 16.09.08 13:38
Ok, Danke, das hab ich wohl gekonnt überlesen. Bei SqlParameter ist dies aber scheinbar nicht der Fall, zumindest laut Doku.
Etwas sonderlich find ich dies Verhalten aber schon, ehrlich gesagt :roll:
Gruß,
raziel
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!