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);

//   Ob das hier noch mal so besetzt wird, sollte eigentlich überflüssig sein.
//                sql = "UPDATE Abnahmeprotokollvorlagen " +
//                      "SET Zeile=@Line " +
//                      "WHERE TypID=@TypeID  AND PunktID=@PointID";
                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

user profile iconraziel 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