![]() |
Datenbank: firebird 1.5 • Zugriff über: ibx, ibexpert
udf in firebird deklarieren
Liste der Anhänge anzeigen (Anzahl: 1)
hallo
ich hab mal versucht, mit hilfe von diesem dokument ( ![]() habe also dll wie im anhang zu sehen gebaut und wollte das ganze dann in meiner datenbank deklarieren:
SQL-Code:
aber das klappt nicht ganz... :cyclops:
declare external function "replace(string varchar(100), old varchar(100), new varchar(100))"
returns varchar(100) entry_point "Replace" module_name "MyFirebirdUDFs"; danke, martin ps: die dll hab ich natürlich in mein firebird-bin-verzeichnis kopiert! |
Re: udf in firebird deklarieren
Ich mach udf mit hilfe von ipexpert
DECLARE EXTERNAL FUNCTION ( Name des udf in Firebird ) "NAME" FLOAT RETURNS FLOAT BY VALUE ENTRY_POINT 'zahl' MODULE_NAME (name des udf im Delphi code) 'udfrand' So verständlich peter |
Re: udf in firebird deklarieren
Zitat:
Kannst du mir das mal anhand meiner UDF zeigen, bitte? Danke, Martin |
Re: udf in firebird deklarieren
Hallo Martin.
Ohne Anspruch auf Schönheit - habe nur die nötigen Verbiegungen an deinem Code durchgeführt:
Delphi-Quellcode:
Und natürlich muss die UDF noch der Datenbank bekannt gemacht werden:
unit Strings;
interface uses SysUtils; function Replace(s, old, new: PChar): PChar; cdecl; export; implementation function Replace(s, old, new: PChar): PChar; begin Result := PChar(StringReplace(String(S), String(Old), String(New), [rfReplaceAll])); end; end.
SQL-Code:
Anstelle in das BIN-Verzeichnis solltest du die library in das UDF-Verzeichnis von FireBird schieben.
DECLARE EXTERNAL FUNCTION REPLACE /* ANSIUPPER */
CSTRING(100), CSTRING(100), CSTRING(100) RETURNS CSTRING(100) FREE_IT ENTRY_POINT 'Replace' MODULE_NAME 'MyFirebirdUDFs' Getippt und nicht getestet. Grüße vom marabu Edit: Es muss REPLACE heißen, nicht ANSIUPPER |
Re: udf in firebird deklarieren
martin hat geschrieben
ps: die dll hab ich natürlich in mein firebird-bin-verzeichnis kopiert! Die DLL datei muß im Unterverzeichnis /UDF liegen. peter |
Re: udf in firebird deklarieren
Zitat:
ein paar Fragen: 1) Warum PChar und nicht WideString? 2) Was hat es mit cstring auf sich? Kann ich der Funktion dann varchar-Parameter übergeben? 3 Wieso ANSIUPPER? Die Funktion sollte ja eigentlich in Firebird auch Replace heißen... 4) Wofür steht FREE_IT? Danke schonmal für die Antwort! Martin |
Re: udf in firebird deklarieren
Hi, zu deinen Fragen:
(1) PChar, weil ich regelmäßig ISO8859-1 speichere. Könnte bei dir auch PWideChar sein, aber das habe ich noch nicht ausprobiert. (2) CSTRING, weil ich keine andere Möglichkeit kenne. Auch ich habe irgendwann mal den Artikel von Greg Deatz gelesen und mit den enthaltenen Informationen eine UDF zu bauen versucht. (3) ANSIUPPER ist ein Überbleibsel von dem Code, den ich mal für einen anderen thread geschrieben hatte und hier nicht sorgfältig genug angepasst habe. Sorry. (4) FREEIT ist das Schlüsselwort, welches anzeigt, dass du keine Ambitionen hast den von Interbase mit dessen memory management functions angeforderten Speicher mit Delphi frei zu geben. Und vergiss nicht, was auch Peter dir nochmal geschrieben hat: \UDF und nicht \BIN ist das richtige Standard-Verzeichnis. Gute Nacht marabu |
Re: udf in firebird deklarieren
Danke, das mit dem Deklarieren klappt jetzt.
Nur will ich jetzt ausführen, bekomm ich: Unsuccessful execution caused by a system error that precludes successful execution of subsequent statements. Access to UDF library "MyFirebirdUDFs.DLL" is denied by server administrator. Dabei bin ich als sysdba eingeloggt! |
Re: udf in firebird deklarieren
-Was für ein Betriebssystem?
-Ist der Zugriff auf das Verzeichnis in der Konfig freigegeben? -Zugriffsrechte auf Datei |
Re: udf in firebird deklarieren
Zitat:
Zitat:
UdfAccess = Restricted Die dll befindet sich in C:\Programme\Firebird\Firebird_1_5\UDF. Soweit ich weiß, wird das Verzeichnis automatisch miteinbezogen. Hatte es auch schon mal explizit dahinter geschrieben. Da kam die gleiche Meldung. Wenn ich es abändere auf UdfAccess = Full dann bekomm ich statt dem vorherigen Fehler diesen: Invalid token. invalid request BLR at offset 63. function REPLACE is not defined. module name or entrypoint could not be found. Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:22 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 by Thomas Breitkreuz