Delphi-PRAXiS

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 11: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 11: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 11: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 13: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 14: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 15: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 17: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 18: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 11: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 11: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(+) '

neo4a 14. Feb 2012 11:24

AW: Parameter werden nicht erkannt?
 
Zitat:

Zitat von p80286 (Beitrag 1150998)
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.

Na wenn Du alles so genau weißt, wieso nimmst Du dann nicht ein Tools Deiner Wahl und schaust - z.B. auf der Server-Seite - nach, was Du da so in Deinem Code zusammenbastelst und was an validen SQL davon ankommt? So komme ich (seit Jahren) zurecht. Manchmal nervt solche patzige Besserwisserei, die scheibchenweise mit Infos herausrückt.

p80286 14. Feb 2012 12:48

AW: Parameter werden nicht erkannt?
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1150750)
ADO und Oracle? dann noch der MS ADO-Provider für Oracle - Kann eigentlich nur schief laufen.

danke das war's,
Ich nutze den MS-Provider eigentlich schon lange nicht mehr, da ist er wohl noch übrig geblieben.
Wer lesen kann ist klar im Vorteil.

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:06 Uhr.

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