Entwickler-Ecke

Datenbanken - Zugriff auf Oracle DB: Ein Parameterobjekt ist nicht ...


jahuer1 - Mi 22.02.06 13:41
Titel: Zugriff auf Oracle DB: Ein Parameterobjekt ist nicht ...
Ich habe ein Problem mit einer neuen Tabelle in Oracle 9.2, die meine Benutzer verwaltet. Die Benutzer haben Namen, Username, Password, etc., wobei Username und Password verschlüsselt hinterlegt werden. Nun können einige Einträge von meiner alten Benutzer-Tabelle nicht in die neue Benutzer-Tabelle übertragen werden. (Das ganze passiert mit einem kleinen Hilfetool mit ADO)

Folgender Insert gibt Fehler (= myQryTxt):

Insert into NEW_BESITZER
(B_DGRP, B_DKEY, B_FNPASSW, B_FNUSER, B_ID, B_KURZ, B_NAME, B_PASSW, B_PGKNZ, B_START, B_VERTR)
values (10000, 0, '\8C\":5]:+#L/6', '!R:W\0#]!_:G\"f', 10020, 'mbr', 'jahuer1', 0, 'P',
To_Date('2006-02-20 00:00:00', 'yyyy-mm-dd hh24:mi:ss'), 10020)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
...
      qry.SQL.Add(myQryTxt);
      try
         qry.ExecSQL;
      except
         on e:Exception do ErrorMemo.Lines.Append(e.Message);
      end;
...


Fehler:
Ein Parameterobjekt ist nicht ordnungsgemäß definiert. Inkonsistente oder unvollständige Informationen wurden angegeben.

Ich habe mal alle Spalten auf Typ etc. untersucht. Es ist alles legal.
Wenn ich das SQL-Statement zudem in SQL Plus laufen lasse, funktionierts einwandfrei.

Wo liegt das Problem?


raiguen - Mi 22.02.06 14:37

Moin!

Ich vermute das Problem in den übergebenden Werten für B_FNPASSW bzw B_FNUSER.
Beide Strings (oder besser Zeichenketten) enthalten einige 'Sonderzeichen' (zb. " oder _ oder ]), die von der ORACLE-DB evtl 'missverstanden' werden könnten, weil diese u.a. Steuerzeichen oder sonstige 'Befehls'-Zeichen sind. In der Dokumentation zur DB mal nachlesen, wie mit solchen 'Sonderzeichen'(auch gerne als 'Literal' bezeichnet) in einem Feldwert gefahrlos umgegangen werden kann.

Um das Problem einzugrenzen, schlage ich vor, den INSERT-Befehl für jedes Feld extra zu erstellen; somit dürfte sich dann schnell herausstellen, was zum Abbruch bzw Fehler führt.
Mag zwar umständlich sein, aber sonst suchst Du Dir nen Wolf und bist kein Stückchen weiter...

Gruß


Robert.Wachtel - Mi 22.02.06 15:53

Ich vermute das Problem eher in einer Missinterpretation des SQL-Strings. Kannst Du nicht zumindest die kritischen Werte (also praktisch alle Strings) des SQL-Statements per Parameter zuweisen?


SQL-Anweisung
1:
2:
3:
Insert into NEW_BESITZER
(B_DGRP, B_DKEY, B_FNPASSW, B_FNUSER)
values (:pDBGRP, :pDKEY, :pPASS, :pUser)


jahuer1 - Do 23.02.06 10:23
Titel: Auslagerung in Parameter
Einen ersten Hinweis habe ich gefunden:

1. Oracle-Treiber: im Minimum V 9.2.0.4 !!! - alles andere ist Schrott (und ich hatte so etwas)
2. Die " (Doppeltes Anführungszeichen) sind unangenehm. Da hat er offenbar grundsätzlich was dagegen.
Es bringt leider auch nichts, diesen String als Parameter zu übergeben. => gibt den gleichen Fehler

Gibts sonst noch eine Idee?


Robert.Wachtel - Do 23.02.06 11:29
Titel: Re: Auslagerung in Parameter
Welchen String meinst Du? Ich kann wildeste Zeichen per Parameter in meine Oracle-Tabellen schreiben (ja, auch per ADO).


jahuer1 - Do 23.02.06 11:50
Titel: Re: Auslagerung in Parameter
Sorry, ja. Du hast recht. Wenn man die Parameter richtig füllt, dann klappts auch...
Ich oracle mal weiter. 8)