AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi udf in firebird deklarieren
Thema durchsuchen
Ansicht
Themen-Optionen

udf in firebird deklarieren

Ein Thema von sancho1980 · begonnen am 17. Jun 2006 · letzter Beitrag vom 18. Jun 2006
Antwort Antwort
Seite 1 von 2  1 2      
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#1

udf in firebird deklarieren

  Alt 17. Jun 2006, 10:40
Datenbank: firebird 1.5 • Zugriff über: ibx, ibexpert
hallo

ich hab mal versucht, mit hilfe von diesem dokument (udfs in delphi bauen) mir eine eigene udf in delphi zu schreiben und sie in firebird zu deklarieren, aber das klappt nicht ganz...könnt ihr mir sagen was ich falsch mache (delphi-projekt im anhang):

habe also dll wie im anhang zu sehen gebaut und wollte das ganze dann in meiner datenbank deklarieren:

SQL-Code:
declare external function "replace(string varchar(100), old varchar(100), new varchar(100))"
returns varchar(100)
entry_point "Replace"
module_name "MyFirebirdUDFs";
aber das klappt nicht ganz...

danke,

martin

ps: die dll hab ich natürlich in mein firebird-bin-verzeichnis kopiert!
Angehängte Dateien
Dateityp: rar dlls_116.rar (43,3 KB, 6x aufgerufen)
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
peter12

Registriert seit: 28. Feb 2005
Ort: Oberneukirchen ,Österreich
183 Beiträge
 
Delphi 2006 Professional
 
#2

Re: udf in firebird deklarieren

  Alt 17. Jun 2006, 10:45
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
  Mit Zitat antworten Zitat
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#3

Re: udf in firebird deklarieren

  Alt 17. Jun 2006, 12:15
Zitat von peter12:
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
Ne, leider nicht.
Kannst du mir das mal anhand meiner UDF zeigen, bitte?

Danke,

Martin
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: udf in firebird deklarieren

  Alt 17. Jun 2006, 13:09
Hallo Martin.

Ohne Anspruch auf Schönheit - habe nur die nötigen Verbiegungen an deinem Code durchgeführt:

Delphi-Quellcode:
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.
Und natürlich muss die UDF noch der Datenbank bekannt gemacht werden:

SQL-Code:
DECLARE EXTERNAL FUNCTION REPLACE /* ANSIUPPER */
    CSTRING(100), CSTRING(100), CSTRING(100)
RETURNS CSTRING(100) FREE_IT
ENTRY_POINT 'Replace' MODULE_NAME 'MyFirebirdUDFs'
Anstelle in das BIN-Verzeichnis solltest du die library in das UDF-Verzeichnis von FireBird schieben.

Getippt und nicht getestet.

Grüße vom marabu

Edit: Es muss REPLACE heißen, nicht ANSIUPPER
  Mit Zitat antworten Zitat
peter12

Registriert seit: 28. Feb 2005
Ort: Oberneukirchen ,Österreich
183 Beiträge
 
Delphi 2006 Professional
 
#5

Re: udf in firebird deklarieren

  Alt 17. Jun 2006, 15:38
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
  Mit Zitat antworten Zitat
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#6

Re: udf in firebird deklarieren

  Alt 17. Jun 2006, 21:06
Zitat von marabu:
Hallo Martin.

Ohne Anspruch auf Schönheit - habe nur die nötigen Verbiegungen an deinem Code durchgeführt:

Delphi-Quellcode:
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.
Und natürlich muss die UDF noch der Datenbank bekannt gemacht werden:

SQL-Code:
DECLARE EXTERNAL FUNCTION ANSIUPPER
    CSTRING(100), CSTRING(100), CSTRING(100)
RETURNS CSTRING(100) FREE_IT
ENTRY_POINT 'Replace' MODULE_NAME 'MyFirebirdUDFs'
Anstelle in das BIN-Verzeichnis solltest du die library in das UDF-Verzeichnis von FireBird schieben.

Getippt und nicht getestet.

Grüße vom marabu
Hi Marabu,
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
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: udf in firebird deklarieren

  Alt 17. Jun 2006, 21:53
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
  Mit Zitat antworten Zitat
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#8

Re: udf in firebird deklarieren

  Alt 17. Jun 2006, 22:31
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!
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: udf in firebird deklarieren

  Alt 18. Jun 2006, 08:41
-Was für ein Betriebssystem?
-Ist der Zugriff auf das Verzeichnis in der Konfig freigegeben?
-Zugriffsrechte auf Datei
Markus Kinzler
  Mit Zitat antworten Zitat
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#10

Re: udf in firebird deklarieren

  Alt 18. Jun 2006, 09:40
Zitat von mkinzler:
-Was für ein Betriebssystem?
stinknormales WinXp

Zitat von mkinzler:
-Ist der Zugriff auf das Verzeichnis in der Konfig freigegeben?
In firebird.conf steht:

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 von mkinzler:
-Zugriffsrechte auf Datei
Gibt's sowas in Windows?
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:14 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