Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Data type unknown (https://www.delphipraxis.net/92215-data-type-unknown.html)

smudo 16. Mai 2007 09:55

Datenbank: Interbase • Version: 6.2 • Zugriff über: UIB

Data type unknown
 
Ich benötige folgende Query:
Code:
select :MyParam, myTable.*
from myTable...
bekomme dabei aber die Fehlermeldung "Data type unknown"

Logisch, er kennt also den Datentyp nicht. Hab jetzt versucht mit cast(:MyParam as varchar(255)) einen Datentyp vorzugeben (so funktionierts unter FB), aber die Fehlermeldung bleibt die gleiche.

Wie kann ich den Datentyp des Parameters im Select bekanntmachen?

Vielen Dank im Voraus
René

marabu 16. Mai 2007 09:58

Re: Data type unknown
 
Hallo René,

du kannst Parameter an Stelle von Feldwerten verwenden, aber nicht anstelle von Feld- oder Tabellennamen.

Freundliche Grüße

smudo 16. Mai 2007 10:01

Re: Data type unknown
 
Gleiches Problem tritt bei Verwendung einer UDF auf, also beispielsweise die UDF lower aus der IB_UDF.
Hier kann ich auch im Where-Abschnitt den Parameter nicht verwenden.

Außerdem, wie gesagt, unter Firebird funktioniert auch ein Parameter im Select

smudo 16. Mai 2007 10:15

Re: Data type unknown
 
Um dem Ganzen noch eins drauf zu setzen:
Was mit lower nicht funktioniert (lower(:myParam)) funktioniert mit upper bestens (upper(:myParam))
:shock: Why?

smudo 22. Mai 2007 15:09

Re: Data type unknown
 
Push :wall:
Es ist mir wirklich wichtig, vielleicht noch ein paar gute Tipps zu hören (außer steig auf Firebird um, oder das geht halt nicht)
Insbesondere bin ich bei der Verwendung von UDFs gehandycapt, wenn ich da keine Parameter verwenden kann.

Udontknow 22. Mai 2007 15:48

Re: Data type unknown
 
Hallo!

Vielleicht schreibst du einfach mal, was genau du damit erreichen möchtest. Ich persönlich bin bis jetzt ganz gut ohne Parameter für Feldnamen ausgekommen...

Cu,
Udontknow

smudo 22. Mai 2007 21:33

Re: Data type unknown
 
Wie schon gesagt, es geht mir weniger um die Parameter für die Feldnamen, sondern um Parameter für UDFs.
Ich habe mir eine UDF zur Anpassung von Strings geschrieben (wandelt Umlaute und bestimmte Buchstabenkombinationen um).

Folgendes funktioniert auch:
SQL-Code:
select Name
from Adressen
where reducechar(Name) = 'mueller'
Hier werden mir alle ausgegeben, welche Müller oder Mueller heißen.

Diese Abfrage möchte ich aber für eine Reihe von Adressen, welche mir in einer CSV-Datei vorliegen, ausführen. Klassischer Fall für Prepare und Parameter.

Ich müsste die Abfrage also dahingehend ändern:
SQL-Code:
select Name
from Adressen
where reducechar(Name) = reducechar(:ListName)
Dabei kommt es unter Interbase zur besagten Meldung: Data type unknown, Firebird machts.

Noch lieber wäre mir folgende Query:
SQL-Code:
select :ListName, Name
from Adressen
where reducechar(Name) = reducechar(:ListName)
Aber da krachts ja schon im select

mkinzler 22. Mai 2007 21:40

Re: Data type unknown
 
Wie hast du reducechar deklariert?

smudo 23. Mai 2007 07:28

Re: Data type unknown
 
SQL-Code:
/* ReduceChar */
DECLARE EXTERNAL FUNCTION ReduceChar
CSTRING(255), INTEGER, INTEGER
RETURNS CSTRING(255) FREE_IT
ENTRY_POINT 'ReduceChar' MODULE_NAME 'myUDFs.dll';
Wie zu sehen ist, habe ich der Einfachheit halber bei meinen SQL-Beispielen die beiden Integer-Übergabeparameter weggelassen.

daddy 23. Mai 2007 20:38

Re: Data type unknown
 
zu 1.:
Hast Du da evtl. ein Problem mit den Hochkommata?
Weise Deinem Parameter doch mal nicht einfach nur den Namen, sondern QuotedStr(SuchName) zu.

zu 2.:
Zitat:

Noch lieber wäre mir folgende Query: ...
Auch hier solltest Du "QuotedStr(SuchName)" zuweisen und dem Feld evtl. noch einen Feldnamen spendieren
SQL-Code:
select :ListName as Suchname, Name
from Adressen
where reducechar(Name) = reducechar(:ListName)

mkinzler 23. Mai 2007 20:40

Re: Data type unknown
 
Zitat:

Weise Deinem Parameter doch mal nicht einfach nur den Namen, sondern QuotedStr(SuchName) zu.
Bei Parametern nicht nötig

daddy 23. Mai 2007 21:23

Re: Data type unknown
 
Also ich hab es inzwischen mal ausprobiert. Mein Vorschlag mit "QuotedStr" brachte tatsächlich nichts. Bei ähnlichen Befehlen, wie Du sie beschrieben hast, erhielt ich ebenfalls die Meldung "DataType unknown". Es funktioniert allerdings, wenn man statt parametrisierter Abfragen, das SQL-Statement selber zusammenbaut und dem SQLQuery zuweist. Also etwa in der Art:

Delphi-Quellcode:
procedure MeineSuche;
var Suchname : String;
begin
  Suchname := ...;
  SQLQuery.Clear;
  SQLQuery.Add('Select ''' + SuchName + ''', Name from Adressen '
               + 'where ReduceChar(Name) = ReduceChar(''' + SuchName + ''')'
  SQLQuery.Open;
  ...
end;
wobei in der Variablen "Suchname" natürlich der von Dir zum Vergleich gesuchte Name steht.

Gruß Daddy

smudo 25. Mai 2007 07:24

Re: Data type unknown
 
Danke daddy cool :lol:

Die von dir angesprochene letzte Lösung ist auch das, was ich momentan verwende. Abfragen mit Parametern sind aber normalerweise performanter, deswegen interessiert mich die Verwendung derselben für UDFs. Wie's aussieht, scheint aber niemand eine Lösung dafür zu kennen, evtl gibts diese gar nicht.
Wieder ein Grund mehr, endlich auf Firebird umzustellen.

daddy 25. Mai 2007 11:53

Re: Data type unknown
 
Ich bin mir nicht sicher, ob Firebird das Problem lösen würde. Zumindest habe ich meine Tests unter Firebird durchgeführt und hatte ja ebenfalls den von Dir beschriebenen Effekt. Ich habe eher den Eindruck (habe das aber nicht näher untersucht), dass man generell über Parameter keine Spaltennamen (und evtl. auch keine Tabellennamen etc.) zuweisen kann.

Gruß Daddy

smudo 25. Mai 2007 12:27

Re: Data type unknown
 
Also, ich glaub ich schriebs schon:
Unter Firebird (2.0) funktionieren Parameter für UDFs problemlos.
Und für Spaltennamen muss man erst einen Cast auf den gewünschten Datentyp machen, dann gehts auch.

daddy 25. Mai 2007 12:45

Re: Data type unknown
 
Na ja, aber es ist ja ein Unterschied, ob ich meinem Query
Delphi-Quellcode:
'Select * from MyTable where lower(MyTable.SpalteX) = lower(:P0)'
zuweise und dann per Parameter einen String auswerten lasse oder ob ich
Delphi-Quellcode:
'Select * from MyTable where lower(:P0) = lower(''mein Suchtext'')'
zuweise und dann per Parameter versuche einen Spaltennamen zu übergeben.

Funktioniert das Letztgenannte denn tatsächlich auch? Ich habe einiges in der Richtung versucht und hatte keinen Erfolg damit. Ich war generell nicht in der Lage, einen Spaltennamen erst per Parameter festzulegen. Auch ein Cast half da nicht weiter. Zeig doch noch mal eine konkrete Zuweisung, mit der es bei Dir klappte.

Gruß Daddy


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:39 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