![]() |
Datenbank: Interbase • Version: 6.2 • Zugriff über: UIB
Data type unknown
Ich benötige folgende Query:
Code:
bekomme dabei aber die Fehlermeldung "Data type unknown"
select :MyParam, myTable.*
from myTable... 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é |
Re: Data type unknown
Hallo René,
du kannst Parameter an Stelle von Feldwerten verwenden, aber nicht anstelle von Feld- oder Tabellennamen. Freundliche Grüße |
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 |
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? |
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. |
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 |
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:
Hier werden mir alle ausgegeben, welche Müller oder Mueller heißen.
select Name
from Adressen where reducechar(Name) = 'mueller' 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:
Dabei kommt es unter Interbase zur besagten Meldung: Data type unknown, Firebird machts.
select Name
from Adressen where reducechar(Name) = reducechar(:ListName) Noch lieber wäre mir folgende Query:
SQL-Code:
Aber da krachts ja schon im select
select :ListName, Name
from Adressen where reducechar(Name) = reducechar(:ListName) |
Re: Data type unknown
Wie hast du reducechar deklariert?
|
Re: Data type unknown
SQL-Code:
Wie zu sehen ist, habe ich der Einfachheit halber bei meinen SQL-Beispielen die beiden Integer-Übergabeparameter weggelassen.
/* ReduceChar */
DECLARE EXTERNAL FUNCTION ReduceChar CSTRING(255), INTEGER, INTEGER RETURNS CSTRING(255) FREE_IT ENTRY_POINT 'ReduceChar' MODULE_NAME 'myUDFs.dll'; |
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:
SQL-Code:
select :ListName as Suchname, Name
from Adressen where reducechar(Name) = reducechar(:ListName) |
Re: Data type unknown
Zitat:
|
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:
wobei in der Variablen "Suchname" natürlich der von Dir zum Vergleich gesuchte Name steht.
procedure MeineSuche;
var Suchname : String; begin Suchname := ...; SQLQuery.Clear; SQLQuery.Add('Select ''' + SuchName + ''', Name from Adressen ' + 'where ReduceChar(Name) = ReduceChar(''' + SuchName + ''')' SQLQuery.Open; ... end; Gruß Daddy |
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. |
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 |
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. |
Re: Data type unknown
Na ja, aber es ist ja ein Unterschied, ob ich meinem Query
Delphi-Quellcode:
zuweise und dann per Parameter einen String auswerten lasse oder ob ich
'Select * from MyTable where lower(MyTable.SpalteX) = lower(:P0)'
Delphi-Quellcode:
zuweise und dann per Parameter versuche einen Spaltennamen zu übergeben.
'Select * from MyTable where lower(:P0) = lower(''mein Suchtext'')'
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 15:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz