IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Firebird Discussion :

UDF en C# - fonction renvoyant du string - ib_util_malloc()


Sujet :

Firebird

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2017
    Messages : 3
    Points : 3
    Points
    3
    Par défaut UDF en C# - fonction renvoyant du string - ib_util_malloc()
    Bonjour à tous.

    Je vous donne le contexte :
    Je suis développeur .net, mes applications sont développés en C#.
    J'ai une application v1 installée chez des clients qui utilise une base firebird, tandis que la V2 de l'application distribuée maintenant, utilise une base Sql serveur.
    Je continu à maintenir la v1, les clients sont satisfaits et ne souhaitent pas passer à la v2.

    Ce que je souhaite faire :
    Je dois générer une valeur de type string en fonction de données et l'enregistrer dans un champs d'une table.
    Que se soit pour la base firebird ou sql serveur, c'est exactement le même traitement, j'ai donc pensé créer une dll avec ma fonction qui me renvoie ma valeur.
    Cette dll sera utilisée à la fois par sql serveur mais aussi par firebird sous forme d'UDF externe.

    Pour l'utilisation sous SQL serveur je n'ai pas de problème, ça fonctionne.

    C'est plus compliqué avec Firebird.

    J'arrive à utiliser ma fonction si elle me retourne autre chose qu'une chaine de caractères (int, decimal...).
    D'après la FAQ Firebird, je vois qu'il y a une gestion particulière de la mémoire allouée à faire lorsqu'un UDF renvoi du string.

    http://firebirdfaq.org/faq83/

    il faut utiliser ib_util_malloc() de la dll ib_util.dll, dans cette même FAQ il y a un exemple d'utilisation en delphi.
    Je ne connais pas le delphi, je comprend en gros ce qui se passe dans cette exemple mais je n'arrive pas à traduire ce code en C#.

    Quelqu'un saurait-il comment retranscrire ce code en C# ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function ib_util_malloc(l: integer): pointer; cdecl; external 'ib_util.dll';
     
    function ChangeMyString(const p: PAnsiChar): PAnsiChar; cdecl;
    var
    s: string;
    begin
    s := DoSomething(string(p));
    Result := ib_util_malloc(Length(s) + 1);
    StrPCopy(Result, AnsiString(s));
    end;
    Merci pour votre aide !
    Forent...

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    convertir en code C# je ne m'en sens pas capable mon C est loin, par contre je peux, à tout le moins, expliquer ce que font les instructions

    ib_util_malloc(Length(s) + 1);
    Alloue de la mémoire, Length taille de la string + 1 le null qui termine la string (en Delphi les string sont "null terminated")
    s'il y a appel à cette fonction c'est parce que l'instruction suivante ne fait aucun contrôle de longueur

    StrPCopy
    Copie la string obtenue (le traitement DoSomething) dans la variable résultat, il s'agit d'un copie par pointeur
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2017
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci SergioMaster pour l'explication détaillée du code.
    Sa me donne des pistes de recherches, copie par pointeur, C# et null terminted strings.
    Je ne suis pas familier des pointeurs non plus.

    J'attends d'autres partage de connaissances, d'experts en C#, firebird, delphi.. qui passeraient par là

    Je continu mes recherches.

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Février 2006
    Messages : 562
    Points : 859
    Points
    859
    Par défaut
    Bonjour.

    Il n'est pas possible de créer une UDF en C#. C# permet de créer des DLL en code managé alors que Firebird peut uniquement lire une DLL native.
    Vous trouverez un exemple de code en C/C++ dans le dossier C:\Program Files\Firebird\Firebird_2_5\examples\udf.
    A lire aussi => https://www.codeproject.com/Articles...ded-SQL-Server

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 346
    Points : 18 958
    Points
    18 958
    Par défaut
    Salut Florent.

    Citation Envoyé par Florent
    Je dois générer une valeur de type string en fonction de données et l'enregistrer dans un champs d'une table.
    Ce que vous demandez est ni plus ni moins une fonction. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    CREATE DATABASE '..\Data\Base.fdb' page_size 4096 DEFAULT CHARACTER SET WIN1252;
     
    -- ==============
    -- Création Table
    -- ==============
     
    create table test (
      id  int      not null primary key,
      lib char(20) not null
    );
     
    insert into test (id,lib) values (1, 'un');
    insert into test (id,lib) values (2, 'deux');
    insert into test (id,lib) values (3, 'trois');
     
    select * from test;
     
              ID LIB
    ============ ====================
               1 un
               2 deux
               3 trois
     
     
    -- =================
    -- Création fonction
    -- =================
     
    SET TERM $;
    CREATE FUNCTION modif (in_deb varchar(255),
                           in_lib varchar(255))
    RETURNS varchar(255)
    AS
    BEGIN
    RETURN (in_deb || substring(in_lib from 1 for 3));
    END$
    SET TERM ;$
     
    commit;
     
    -- =========
    -- exécution
    -- =========
     
    update test set lib = modif('PM ', lib);
     
    select * from test;
     
              ID LIB
    ============ ====================
               1 PM un
               2 PM deu
               3 PM tro
     
    exit;
     
    Appuyez sur une touche pour continuer...
    Citation Envoyé par Florent
    Pour l'utilisation sous SQL serveur je n'ai pas de problème, ça fonctionne.
    Il serait intéressant de nous communiquer votre traitement aussi bien celui de Microsoft SQL Server que celui de FireBird.

    Citation Envoyé par Florent
    j'ai donc pensé créer une dll avec ma fonction qui me renvoie ma valeur.
    Quel est l'intérêt de créer une DDL ? Votre fonction travaille au niveau du SGBDR FireBird !
    Est-ce que vous avez des problèmes de performances avec FireBird ?

    J'ai du mal à vous suivre car Microsoft SQL Server et FireBird ne sont pas des SGBDR identiques.
    A moins de me tromper, je pense que vous faites une confusion entre une fonction FireBird et une fonction UDF du langage Delphi.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par Artemus24 Voir le message
    J'ai du mal à vous suivre car Microsoft SQL Server et FireBird ne sont pas des SGBDR identiques.
    A moins de me tromper, je pense que vous faites une confusion entre une fonction FireBird et une fonction UDF du langage Delphi.
    Justement, une fonction contenue dans une DLL permettrait d'avoir la même fonctionnalité.
    une fonction UDF n'est pas forcément écrite en Delphi mais plus généralement en C là , c'est toi qui confond.
    Par contre je ne savais pas qu'elle (la DLL) ne pouvait être écrite en C# ! la faute au .net je pense
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 346
    Points : 18 958
    Points
    18 958
    Par défaut
    Salut SergioMaster.

    Citation Envoyé par SergioMaster
    Justement, une fonction contenue dans une DLL permettrait d'avoir la même fonctionnalité.
    Non, je ne suis pas d'accord avec vous car dans une DDL, vous devez nécessairement utiliser des API pour accéder au SGBDR.
    Et ce ne sont pas les mêmes API pour Microsoft SQL Server et FireBird.

    Ou alors la fonction en question n'a aucun rapport avec un quelconque SGBDR et dans ce cas là, je suis d'accord.

    Citation Envoyé par SergioMaster
    une fonction UDF n'est pas forcément écrite en Delphi mais plus généralement en C là , c'est toi qui confond.
    Je ne confonds rien du tout car je n'ai pas compris la question posée par Florent.
    Plus précisemment, ce qu'il cherche à faire et surtout dans quel contexte.

    Comme nous sommes dans le forum consacré à FireBird et qu'il parle d'une fonction, j'ai tout de suite pensé à l'exemple que j'ai donné : une fonction sous FireBird.

    Il aborde la question d'une fonction UDF. Je n'ai jamais utilisé cela sous FireBird.
    J'ai déjà créé des fonction dans une DLL dans le cadre d'un développement en C/C++ mais je pense que cela n'a aucun rapport avec sa demande.
    Une DLL, c'est une façon d'externaliser des fonctionnalités écrite en C/C++ afin de pouvoir les réutiliser dynamiquement dans plusieurs applications.

    Or là, j'ignore le rapport avec le SGBDR ? Et c'est ça qui me dérange car la notion de fonction est trop vague pour être traité correctement.
    S'il dit qu'il a résolu sa fonction pour Microsoft SQL Server, c'est que sa fonction est spécifique à ce SGBDR, non ?

    C'est pourquoi, je demande à Florent de nous donner le contenu de sa fonction, histoire de comprendre ce qu'il cherche à faire.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Non, je ne suis pas d'accord avec vous car dans une DDL, vous devez nécessairement utiliser des API pour accéder au SGBDR.
    Et ce ne sont pas les mêmes API pour Microsoft SQL Server et FireBird.
    Oui, mais rien n'empêche d'avoir une fonction surchargée ou même deux fonctions une pour Oracle, une pour Firebird
    Ou alors la fonction en question n'a aucun rapport avec un quelconque SGBDR et dans ce cas là, je suis d'accord.
    voilà tel que moi j'ai compris la demande

    Il aborde la question d'une fonction UDF. Je n'ai jamais utilisé cela sous FireBird.
    J'ai déjà créé des fonction dans une DLL dans le cadre d'un développement en C/C++ mais je pense que cela n'a aucun rapport avec sa demande.
    Une DLL, c'est une façon d'externaliser des fonctionnalités écrite en C/C++ afin de pouvoir les réutiliser dynamiquement dans plusieurs applications.
    c'est exactement ça le but d'une UDF.

    les fonctions (CREATE FUNCTION) proposées en interne dans Firebird ne peuvent proposé que ce qui est possible par langage procédural.
    Dans ta proposition elle devient un "raccourci" pratique à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT id, id|| substring(lib from 1 for 3) FROM test
    --remplacé par
     SELECT id,modif(id,lib) FROM test
    Toutefois ce n'est pas toujours possible par ce biais. Au fil du temps des UDF ont vu le jour FreeAdHoc en contient une belle collection, certaines sont devenues obsolètes au fil des versions, d'autres ne sont plus maintenues ....

    Il y a peu, lors de la rédaction d'un tutoriel n'ayant strictement rien à voir avec Firebird, je proposai la rédaction d'une fonction UDF permettant de convertir des formules simples (en Delphi mais cela aurait pu être en C++ avec RAD Studio d'Embarcadero)

    Or là, j'ignore le rapport avec le SGBDR ? Et c'est ça qui me dérange car la notion de fonction est trop vague pour être traité correctement.
    S'il dit qu'il a résolu sa fonction pour Microsoft SQL Server, c'est que sa fonction est spécifique à ce SGBDR, non ?
    je suis d'accord ce n'est pas forcément très clair, comme les deux SGBDR ne semble pas coexister je ne vois pas pourquoi on aurait une seule DLL pour les deux sauf pour des questions de maintenance (un seul code général)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2017
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Bonjour à tous et merci pour vos réponses.

    Ma fonction génère une chaine de caractère cryptée à partir de données, qui sera sauvée dans la base. J'ai besoins d'une fonction dans une dll (UDF externe sous firebird), qui sera utilisée par scripts sql sous sql serveur et firebird.
    En gros une fonction du même genre qu'un substring()...

    Ma fonction n'accède pas à la base, je n'insère rien, ne modifie rien de la base, elle mouline les données en entrée et retourne le résultat qui sera utilisé dans mon script sql.

    Pour pouvoir utiliser ma dll C# avec firebird, ma fonction est exportée en code non managé.

    @ddaime : Merci, je n'avais pas vu les fichiers d'exemple en C/C++.

    J'ai passé trop de temps à essayer de le faire en C# ,avec les contraintes et les difficultés pour traduire du code exemple delphi ou C en C#, je préfère me mettre au C je pense que sa sera plus rapide. 😒

    Encore merci pour votre aide. 👍🏽

  10. #10
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Février 2006
    Messages : 562
    Points : 859
    Points
    859
    Par défaut
    Bonjour Florent.

    J'ai beau vous relire je ne comprend absolument rien à ce que vous cherchez à faire. Il nous manque des informations et j'ai comme l'impression que vous vous compliquez la vie. Dans le premier post vous dites avoir résolu le problème avec SQL Server, comment ? En créant un projet Database SQL Server dans Visual Studio (il s'agit dans ce cas d'une DLL compilée en code managé et liée à la base de données SQL Server) ?

    Si votre fonction n'a aucun rapport avec la base de données (Firebird ou MSSQL), je parle de lecture / écriture en base alors il ne sert à rien de faire une UDF pour chaque SGBD. Faites une DLL en code managé (C#, VB ou C++ CLI) dans laquelle vous implémentez votre fonction ou tout autre traitement. Implémentez ensuite l'interface IDBConnection pour accéder de façon générique à Firebird ou MSSQL.

  11. #11
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 346
    Points : 18 958
    Points
    18 958
    Par défaut
    Salut à tous.

    Citation Envoyé par SergioMaster
    voilà tel que moi j'ai compris la demande
    En lisant le sujet de florent, j'ai eu un problème de compréhension car je ne comprenais pas le rapport entre FireBird et Microsoft SQL Server.
    Soit deux choses l'une, ou bien c'est spécifique à une base de données, ou bien ça n'est pas le cas !

    Citation Envoyé par SergioMaster
    c'est exactement ça le but d'une UDF.
    Je chipote peut-être mais une UDF n'a pas, selon moi, le même sens que'une fonction dans une "Dynamic Link Library".
    Quand on me parle d'UDF (User Defined Functions), je comprends que cela a un rapport avec les bases de données.
    Ensuite, c'est un utilisateur qui va la créer pour un besoin spécifique.
    Cet utilisateur qui l'a créé (ou un autre), peut la modifier à sa guise et facilement.

    Dans le cas d'une fonction DLL, cela ne concerne pas spécifiquement un SGBDR, mais d'une manière plus large, un traitement procédural.
    Et elle n'a pas vocation à être modifiée par un quelconque utilisateur et devient partie intégrante des fonctionnalités de l'application.
    Et ces fonctionnalités dans une DLL sont plus des outils pour faciliter la simplification de l'écriture d'un traitement procédural.
    Je prends comme exemple les fonctions de type string dans le langage C/C++. Autrement dit, ce sont des outils basiques.

    Citation Envoyé par SergioMaster
    Il y a peu, lors de la rédaction d'un tutoriel n'ayant strictement rien à voir avec Firebird, je proposai la rédaction d'une fonction UDF permettant de convertir des formules simples (en Delphi mais cela aurait pu être en C++ avec RAD Studio d'Embarcadero)
    L'intérêt de ces fonctions stockées dans une DLL est d'être utilisable par presque tous les langages informatiques.

    En conséquence de quoi, je ne voie pas l'intérêt de créer une DLL pour y stocker une fonction et encore moins, une UDF (de l'exemple tiré de Firebird).
    Ou alors, il me manque une information pour mieux comprendre l'intérêt de tout ça.
    C'est plutôt une simple fonction que l'on implémente dans le langage utilisé, ici, le langage C#.

    Citation Envoyé par ddaime
    J'ai beau vous relire je ne comprend absolument rien à ce que vous cherchez à faire.
    Cela me rassure car je ne suis pas le seul à n'avoir rien compris au but de la demande.

    Citation Envoyé par ddaime
    Dans le premier post vous dites avoir résolu le problème avec SQL Server, comment ?
    J'ai déjà formulé la demande et j'attends toujours de la part de florent, le script en question.

    Citation Envoyé par ddaime
    Si votre fonction n'a aucun rapport avec la base de données (Firebird ou MSSQL), je parle de lecture / écriture en base alors il ne sert à rien de faire une UDF pour chaque SGBD.
    C'est ce que j'ai compris de la demande, à savoir une fonction qui ne fait que de la manipulation de données, sans faire des accès à la base de données.
    Mon exemple de fonction, implémenté dans FireBird, est ce genre de solution. D'ailleurs, SergioMaster m'a fait la remarque :
    Citation Envoyé par SergioMaster
    Dans ta proposition elle devient un "raccourci" pratique à :
    à savoir, une fonction regroupant un traitement procédural, afin de faciliter la maintenance applicative.

    On peut dans ce cas là, ignorer la fonction FireBird (et de surcroît la fonction Microsoft SQL Server), en faisant en sorte de gérer ce problème au niveau du langage seul.

    Citation Envoyé par Florent
    Ma fonction génère une chaîne de caractère cryptée à partir de données, qui sera sauvée dans la base.
    C'est plus clair, créer une fonction de chiffrement. Pourquoi ne pas utiliser ce qui existe déjà, à savoir des fonctions de chiffrement ?
    Par contre, je ne m'y connais rien, en chiffrement, sous FireBird.

    Citation Envoyé par Florent
    J'ai besoins d'une fonction dans une dll (UDF externe sous firebird), qui sera utilisée par scripts sql sous sql serveur et firebird.
    Une fonction dans une DLL, oui, je veux bien, car vous désirez d'une part l'externaliser afin de ne conserver, pour des raisons de sécurités, que l'exécutable et d'autre part d'utiliser la fonction dans votre application, sans trop se poser de question sur son fonctionnement.
    Sinon où allez-vous mettre votre clef de chiffrement ? Dans la fonction qui sera dans votre DLL ?

    Citation Envoyé par Florent
    Ma fonction n'accède pas à la base, je n'insère rien, ne modifie rien de la base, elle mouline les données en entrée et retourne le résultat qui sera utilisé dans mon script sql.
    Cela n'a aucun rapport avec un SGBDR. C'est juste une façon de manipuler une chaîne de caractères.

    Et donc, vous devriez plutôt vous adresser au forum consacré au langage C#.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    @Artemus je viens de lire le dernier post et je pense que il y a un problème entre DDL (Data Definition Language) et DLL (Dynamic Link Library)

    Je chipote peut-être mais une UDF n'a pas, selon moi, le même sens qu'une fonction dans une DDL.
    si je lis DDL je comprends pas, si je lis DLL alors chipotons... pour moi une UDF, fonction contenue dans une DLL a tout son sens sauf que, bien évidemment, cette fonction utilise la SGBDR donc est spécifique à ce dernier, mais rien n'empêche je pense de faire des fonctions de nom différents mais de syntaxe identique pour plusieurs SGBDR.
    Quand on me parle d'UDF (User Defined Functions), je comprends que cela a un rapport avec les bases de données.
    Oui
    Ensuite, c'est un utilisateur qui va la créer pour un besoin spécifique.
    Cet utilisateur qui l'a créé (ou un autre), peut la modifier à sa guise et facilement.
    l'utilisateur de la SGBD, Non, je dirais uniquement le développeur. L'utilisateur lui utilisera cette fonction comme partie intégrante de son SGBDR sans se poser la question de savoir si c'est "de base" ou non. L'UDF étant déclaré dans le DDL de la base est utilisable.

    l'exemple du cryptage n'est peut être pas si mal que ça pour expliquer le besoin de Florent.
    Imaginons une table Utilisateurs(NOM,MOTDEPASSE) identique dans deux SGBD différents (en l'occurrence Firebird et SQL Server) je ne sais si SQL Server permet de crypter une colonne en tout cas ce n'est pas le cas de Firebird (tout ou rien).
    Pour Firebird j'établirai donc 2 fonctions UDF F_CRYPTE et F_DECRYPTE (avec un code de mon cru) qui permettrait au niveau d'une requête SQL d'écrire ou récupérer la colonne MOTDEPASSE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    INSERT INTO UTILISATEURS VALUES ('TOTO',F_CRYPTE('1234'));
    SELECT NOM,F_DECRYPTE(MOTDEPASSE) FROM UTILISATEURS;
    Je passe sur : -l'endroit de stockage de la clé de chiffrement s'il y en a une ( dans la DDL ou non)
    - la sécurité (droit d'utilisation de la fonction), si tout les utilisateurs/rôles peuvent utiliser les fonctions elles ne servent à rien !

    En tant que Dev. si je devais ensuite utiliser une autre SGBDR tout en gardant le même système de cryptage je peux concevoir que je vais dans la même DLL créer deux autres fonctions pour ce nouveau SGBDR, cela me parait lourd je préfère de loin deux DLL différentes mais ...

    Ceci étant, j'éviterai d'utiliser une couche supplémentaire inutile .NET nécessaire au C# semble t-il pour écrire ces fonctions en C++

    Un gros bémol toutefois au niveau des termes UDF de Firebird et UDF de SQL Server ne semble pas être la même chose
    je me trompe peut être mais après un bref survol je dirais que UDF Firebird = CLR SQL Server, FUNCTION de Firebird = UDF de SQL server
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  13. #13
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 346
    Points : 18 958
    Points
    18 958
    Par défaut
    Salut Sergiomaster.

    Citation Envoyé par SergioMaster
    @Artemus je viens de lire le dernier post et je pense que il y a un problème entre DDL (Data Definition Language) et DLL (Dynamic Link Library)
    Désolé mais en me relisant, j'ai mis partout DDL au lieu de DLL pour "Dynamic Link Library".
    C'est bien de la DLL ont je parlais. J'ai corrigé mon dernier message.

    Citation Envoyé par SergioMaster
    pour moi une UDF, fonction contenue dans une DLL a tout son sens sauf que, bien évidemment, cette fonction utilise la SGBDR donc est spécifique à ce dernier, mais rien n'empêche je pense de faire des fonctions de nom différents mais de syntaxe identique pour plusieurs SGBDR.
    La fonction de type UDF (tel que je la connais dans MySql), je préfère la mettre au niveau de la base de données, au même titre que la procédure stockée, ou les déclencheurs (trigger) car c'est leur place logique.
    Dans une "Dynamic Link Library", je préfère mettre des traitements procéduraux, que je vais réutiliser dans plusieurs applications C/C++.

    Pour ce qui est des fonction UDF comme le propose FireBird, je n'ai jamais utilisé cela et je peux comprendre tout l'intérêt de vouloir enrichir le noyau de FireBird par des fonctionnalités manquantes.

    Citation Envoyé par SergioMaster
    l'utilisateur de la SGBD, Non, je dirais uniquement le développeur.
    Oui, c'est le créateur de la fonction, donc un développeur, voire même un administrateur de base de données.

    Citation Envoyé par SergioMaster
    L'utilisateur lui utilisera cette fonction comme partie intégrante de son SGBDR sans se poser la question de savoir si c'est "de base" ou non.
    C'est là que je fais la distinction entre :

    (1) les UDF comme je les retrouve dans MySql et dans Microsoft SQL Server (Data Definition Language) , c'est-à-dire implémenté au niveau de la base de données.
    (2) les UDF à la FireBird qui sont un enrichissement en fonctionnalité du noyau de ce SGBDR.
    (3) des fonctionnalités de type "Dynamic Link Library", dans le cadre d'un développement dans le langage C/C++.

    Ce qui est relatif à un SGBDR, je le fais dans le cadre (1). Ce qui est applicatif, je le fais dans le cadre (3).
    Je comprends tout l'intérêt du cadre (2) mais cela reste particulier à moins que le problème se pose en tant que performance ou en tant que fonction inexistante sous FireBird. Selon moi, cela reste marginale.

    Citation Envoyé par SergioMaster
    l'exemple du cryptage n'est peut être pas si mal que ça pour expliquer le besoin de Florent.
    Si je fais un parallèle avec MySql, ce sont des fonctions de nom "md5", aesencrypt", ...
    Sauf que dans ce cadre (2), c'est le développeur qui va l'introduire dans le sgbdr.
    Selon moi, cela reste applicatif et donc dans le cadre (3).

    Citation Envoyé par SergioMaster
    En tant que Dev. si je devais ensuite utiliser une autre SGBDR tout en gardant le même système de cryptage je peux concevoir que je vais dans la même DLL créer deux autres fonctions pour ce nouveau SGBDR, cela me parait lourd je préfère de loin deux DLL différentes mais ...
    Autant externaliser ces fonctions de chiffrement dans une DLL applicative. Sur ce point, nous sommes d'accord.
    Disons qu'il n'y a aucun intérêt à ce que cette fonction UDF soit implémenté dans FireBird car il y a un risque de sécurité.
    C'est au travers de l'application que le chiffrement et déchiffrement doit se faire et non le rendre accessible par n'importe venant se gréffer sur la base de données.

    Citation Envoyé par SergioMaster
    Un gros bémol toutefois au niveau des termes UDF de Firebird et UDF de SQL Server ne semble pas être la même chose
    je me trompe peut être mais après un bref survol je dirais que UDF Firebird = CLR SQL Server, FUNCTION de Firebird = UDF de SQL server
    Sur ce point, je reconnais mon ignorance. Si SQLPRO passe par ici, il pourra nous renseigner.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  14. #14
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Sous SQL Server, le terme UDF désigne tous les types de fonctions :
    - fonctions multi instructions (scalaire ou table)
    - fonctions table en ligne
    - fonctions CLR, qui font effectivement appel au .Net.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/06/2010, 16h21
  2. Fonction renvoyant une string
    Par salseropom dans le forum C
    Réponses: 8
    Dernier message: 04/05/2006, 12h44
  3. [C#] Fonction pour convertir string[] vers ArrayList
    Par luimême dans le forum Windows Forms
    Réponses: 6
    Dernier message: 07/04/2005, 14h25
  4. [VB6] [Syntaxe] Fonction renvoyant un tableau d'objets
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/10/2002, 16h33
  5. fonction renvoyant un tableau en argument
    Par Jones dans le forum Langage
    Réponses: 6
    Dernier message: 30/09/2002, 19h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo