Autor Beitrag
raziel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: Di 16.09.08 07:15 
Guten Morgen :gaehn:,

ich hab ein kleines Problem mit OleDbParameter[meta]SqlParameter[/meta]. Und zwar geht es um folgende Tabelle:

ausblenden 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]:

ausblenden 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:
ausblenden 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

_________________
JSXGraph
raziel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: 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

_________________
JSXGraph
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: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: 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

_________________
JSXGraph