Autor |
Beitrag |
raziel
      
Beiträge: 2453
Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
|
Verfasst: Di 16.09.08 07:15
Guten Morgen  ,
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?  ).
Danke schonmal,
Gruß,
raziel
_________________ JSXGraph
|
|
raziel 
      
Beiträge: 2453
Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
|
Verfasst: 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  Was ich ziemlich erstaunlich finde
Gruß,
raziel
_________________ JSXGraph
|
|
JüTho
      
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
|
Verfasst: 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 Was ich ziemlich erstaunlich finde |
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 
      
Beiträge: 2453
Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
|
Verfasst: 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
Gruß,
raziel
_________________ JSXGraph
|
|
|