Hallo Leute,
ich verwende die ADO-Komponenten (nicht-visuell sondern per Instanziierung im Source für eine Konsolenanwendung) TADOConnection und TADOCommand, um auf eine
SQL Server Compact Edition Datenbank (Version 3.5) aus
Delphi 2005 heraus zuzugreifen.
Nach meinem ersten Test der Machbarkeit mit "einfachen SQL-Strings", möchte ich nun auf parametrisierte Abfragen umstellen, damit ich später mehrere Inserts mit wechselnden Parameter-Werten (halbwegs) performant ausführen kann.
Der Zugriff klappt grundsätzlich auch ganz wunderbar und auch bei der Verwendung von einem einzigen Parameter läuft alles ordentlich durch.
Mein Problem:
Wenn ich mehrere Parameter verwende, stürzt die Anwendung ab (ich kann keine Exception fangen, auch nicht bei schrittweisem Debuggen).
Hier ein Minimalbeispiel:
Die Testdatenbank besteht nur aus einer einzigen, einfachen Tabelle, die mit folgendem Statement erzeugt wurde:
SQL-Anweisung
1:
| CREATE TABLE ZweiParameterTest (feld1 nvarchar(100), feld2 nvarchar(100)) |
Und hier meine Funktion:
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:
| procedure InsertThingsIntoDatabase; var adoConn: TADOConnection; adoCmd: TADOCommand; i: Integer; begin try try adoConn := TADOConnection.Create(nil); adoConn.ConnectionString := 'Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;Data Source="X:\test.sdf";';
adoConn.Open;
adoCmd := TADOCommand.Create(nil); adoCmd.Connection := adoConn;
adoCmd.CommandText := 'INSERT INTO ZweiParameterTest (feld1, feld2) VALUES (:feld1, :feld2);';
adoCmd.Prepared := true;
adoCmd.Parameters[0].Value := 'Test'; adoCmd.Parameters[1].Value := 'Test'; adoCmd.Execute; except end; finally adoConn.Close; adoCmd.Free; adoConn.Free; end; end; |
Das habe ich schon erfolglos probiert:
- ADOQuery statt ADOCommand
- Verwendung von Parametern über "?" oder "@paramName"
- Andere Datentypen statt nvarchar
- Setzen von adoCmd.ParamCheck := false
- Parameter per Namen und nicht per Index ansprechen.
- Explizites Setzen des "DataType" der TParameter-Objekte.
- Bei Verwendung einer MySQL-Datenbank funktioniert der Code
Vielleicht erkennt ja jemand, was ich falsch mache oder was ich noch probieren könnte.
Vielen Dank.
[CHANGELOG]
13.07.09: Liste erfolgloser Versuche erweitert nach Ideen von bummi und Critter
13.07.09: Zu Testzwecken MySQL-Datenbank verwendet. Damit geht es. hmmm...
[/CHANGELOG]