Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Parameter werden nicht erkannt? (https://www.delphipraxis.net/166424-parameter-werden-nicht-erkannt.html)

p80286 13. Feb 2012 12:11

Datenbank: oracle • Version: 9 • Zugriff über: ado

Parameter werden nicht erkannt?
 
Hallo zusammen, ich beiße mir jetzt einige Zeit an einem für mich unerklärlichen Fehler die Zähne aus:
Delphi-Quellcode:
   SQL_TEXT1='SELECT COUNT(cases.casekey) '+
              'FROM CASES,CASENAME,TABLENAMETYPE '+
              'WHERE CASES.CASEKEY=CASENAME.CASEKEY '+
              ' AND CASENAME.NAMEKEY=''1234567'' '+
              ' AND CASENAME.NAMETYPEKEY=TABLENAMETYPE.NAMETYPEKEY(+) '
              ;

begin
  cases:='';
  namekey:='1234567';
  Doub_DM.ADOQuery1.Close;
  Doub_DM.ADOQuery1.SQL.Text:=SQL_TEXT1;
 // Doub_DM.ADOQuery1.parameters.parambyname('_NAMEKEY').Value:=namekey;
  Doub_DM.ADOQuery1.Open;
  if not(Doub_DM.ADOQuery1.eof) then begin....
Diese Abfrage Funktioniert soweit.
Nutze ich aber die Parameter kommt nur noch
"ORA-00937 not a single group group function"

Delphi-Quellcode:
   SQL_TEXT1='SELECT COUNT(cases.casekey) '+
              'FROM CASES,CASENAME,TABLENAMETYPE '+
              'WHERE CASES.CASEKEY=CASENAME.CASEKEY '+
              ' AND CASENAME.NAMEKEY=:_NAMEKEY '+
              ' AND CASENAME.NAMETYPEKEY=TABLENAMETYPE.NAMETYPEKEY(+) '
              ;

begin
  cases:='';
  namekey:='1234567';
  Doub_DM.ADOQuery1.Close;
  Doub_DM.ADOQuery1.SQL.Text:=SQL_TEXT1;
  Doub_DM.ADOQuery1.parameters.parambyname('_NAMEKEY').Value:=namekey;
  Doub_DM.ADOQuery1.Open;
  if not(Doub_DM.ADOQuery1.eof) then begin...
Ich seh nicht was es ist.
Könnt Ihr mir weiter helfen?

Gruß
K-H

Bernhard Geyer 13. Feb 2012 12:18

AW: Parameter werden nicht erkannt?
 
ADO und Oracle? dann noch der MS ADO-Provider für Oracle - Kann eigentlich nur schief laufen.

p80286 13. Feb 2012 12:52

AW: Parameter werden nicht erkannt?
 
komm bitte, keine Grundsatzdiskussion....
(Aber ich hab den Oracle-Provider im Einsatz)

Selbst die älteste MS/Oracle Kombination sollte doch wohl in der Lage sein, so eine pisselige Abfrage zu interpretieren?

Gruß
K-H

ibp 13. Feb 2012 14:22

AW: Parameter werden nicht erkannt?
 
steht vielleicht paramcheck auf false?

edit...

ach quatsch... namekey ist doch ein string oder, versuch es doch mal so...

Code:
Doub_DM.ADOQuery1.parameters.parambyname('_NAMEKEY').AsString:=namekey;

p80286 13. Feb 2012 15:11

AW: Parameter werden nicht erkannt?
 
Kann er nicht!
Die Übergabe funlktioniert nur mit Value!
Auslesen mit .AsString .AsFloat......

Gruß
K-H

shmia 13. Feb 2012 16:23

AW: Parameter werden nicht erkannt?
 
Also ich würde an deiner Stelle die neue SQL/99 Join-Syntax einsetzen.
Delphi-Quellcode:
SQL_TEXT1='SELECT COUNT(cases.casekey) '+
          'FROM CASES JOIN CASENAME ON CASES.CASEKEY=CASENAME.CASEKEY '+
          'LEFT OUTER JOIN TABLENAMETYPE ON CASENAME.NAMETYPEKEY=TABLENAMETYPE.NAMETYPEKEY '+
          'WHERE CASENAME.NAMEKEY=:NameKey';
Diese neue Syntax hat 2. Vorteile:
1.) Datenbank + Anwendung ist leichter auf andere Datenbanken portierbar und ausserdem leichter zu lesen weil man genau sieht was wie verjoinet wird.

2.) Die SQL-Anweisung wird ja zur Laufzeit von der VCL bzw. ADO geparsed. Dabei wird versucht, Parameter sowie dessen Datentypen zu ermitteln.
Dabei dürfte der Parser mit der Standard JOIN Syntax besser zurechkommen als mit der proparitären JOIN-Syntax von Oracle.

Um den Parameter zu befüllen würde ich folgenden Weg verwenden (weil kürzeste Schreibweise):
Delphi-Quellcode:
Doub_DM.ADOQuery1.Parameters.ParamValues['_NAMEKEY']:=namekey;

jobo 13. Feb 2012 18:48

AW: Parameter werden nicht erkannt?
 
Also 9er Clients von Oracle himself sind noch nicht so der Hammer.
Was hat das Oracle Feld für einen Typ?
Was ist damit, geht das?
SQL-Code:
select count(dual.dummy)
  from dual, dual d1, dual d2
 where d1.dummy = d2.dummy
   and dual.dummy = d1.dummy
   and dual.dummy = d2.dummy(+)
   and dual.dummy = :_myparam
Ich würd mal auf Verdacht den Parameternamen ohne Unterstrich verwenden. Außer es ist bekannt, dass es an anderer Stelle unproblematisch ist.

neo4a 13. Feb 2012 19:05

AW: Parameter werden nicht erkannt?
 
Zitat:

Zitat von p80286 (Beitrag 1150746)
Delphi-Quellcode:
  Doub_DM.ADOQuery1.parameters.parambyname('_NAMEKEY').Value:=namekey;

Hast Du die Möglichkeit, das Prepared-Query einzusehen? Vielleicht gehört der Parameter einfach gequotet:

Delphi-Quellcode:
  Doub_DM.ADOQuery1.parameters.parambyname('_NAMEKEY').Value:= ''' + namekey + ''';

p80286 14. Feb 2012 12:00

AW: Parameter werden nicht erkannt?
 
Also
mit Unterstrich arbeite ich seit "Jahren" da sind bisher noch keine Probleme aufgetreten. Aber ohne zickt er genauso.
Nix mit Quoted, das ist ja das gute an Parametern, daß diese Hochkommaorgien wegfallen.
Achja es handelt sich um einen Key der als String an die Abfrage übergeben wird, läuft in anderen Abfragen auch seit "Jahren" problemlos.

Jetzt hab ich es mit einem numerischen Wert versucht und es klappt auch nicht.

OK, letzte Möglichkeit, die Abfrage aus mehreren Teilen zusammengesetzt, jetzt geht's.
(warum muß mann immer vom geraden weg abweichen?)

Gruß
K-H

P.S.
Ich hab mit dem ADO-Trace drauf geschaut, es sah alles ordentlich aus.

jobo 14. Feb 2012 12:12

AW: Parameter werden nicht erkannt?
 
Zitat:

Zitat von p80286 (Beitrag 1150998)
OK, letzte Möglichkeit, die Abfrage aus mehreren Teilen zusammengesetzt, jetzt geht's.

Was bedeutet das genau?

Deine Abfrage sieht zumindest schon "mehrzeilig" aus.
Code:
   SQL_TEXT1='SELECT COUNT(cases.casekey) '+
              'FROM CASES,CASENAME,TABLENAMETYPE '+
              'WHERE CASES.CASEKEY=CASENAME.CASEKEY '+
              ' AND CASENAME.NAMEKEY=:_NAMEKEY '+
              ' AND CASENAME.NAMETYPEKEY=TABLENAMETYPE.NAMETYPEKEY(+) '


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:18 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf