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

MS SQL Server Discussion :

Appel d'une méthode d'un UDT


Sujet :

MS SQL Server

  1. #1
    Membre habitué Avatar de 1tsiMat
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    139
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 139
    Points : 127
    Points
    127
    Par défaut Appel d'une méthode d'un UDT
    Bonjour,

    Pour mon stage je dois réaliser un UDT (User Defined Type), je l'ai créé grâce au webcast de Pascal Belaud, tout se passe bien, sauf que mon tuteur me demande de savoir si on peut, dans SQL Server 2005, appeler une méthode qui retourne n'importe quel type, je fouine un peu trouve que l'on peut appeler n'importe quelle méthode en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select MaColonneTypee::MaMethode() from MaTable
    Sur l'exemple de Pascal Belaud, que j'ai reproduis, j'ai créé une méthode qui renvoit un string en disant je suis passé dans la méthode. Mais lorsque je fais mon select, voici ce que SQL Server me répond
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Type MaColonneTypee is not a defined system type
    Voilà j'ai essayé de retourner tous les types, rien y fait, cela m'affiche cela...

    J'espère que j'ai été clair sur mon soucis, n'hésitez pas à me demander des précisions.

    Merci d'avance
    N'oubliez pas, si votre problème est résolu, mettez le tag
    En informatique, il n'y a pas de problème, toujours des solutions (parfois pas évidentes à trouver )

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 847
    Points : 52 962
    Points
    52 962
    Billets dans le blog
    6
    Par défaut
    Quelque soit le type interne de votre UDT il doit implémenter les méthodes de lecture et d'écriture en string (ToString et Parse). Auquel cas il est vu au niveau interface comme une chaîne de caractère.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre habitué Avatar de 1tsiMat
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    139
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 139
    Points : 127
    Points
    127
    Par défaut
    Mon UDT contient Parse, String, l'interface INullable, ...

    J'ai essayé de retourner mon type en faisant des opérations sur mes données membres, j'ai essayé de retourner un int, un SqlInt32, un string, un SqlString et rien y fait toujours ce problème
    N'oubliez pas, si votre problème est résolu, mettez le tag
    En informatique, il n'y a pas de problème, toujours des solutions (parfois pas évidentes à trouver )

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 847
    Points : 52 962
    Points
    52 962
    Billets dans le blog
    6
    Par défaut
    donnez l'exemple complet (code CLR + assembly SQL) et les requêtes que vous tentez de faire.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre habitué Avatar de 1tsiMat
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    139
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 139
    Points : 127
    Points
    127
    Par défaut
    Code C#
    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
     
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data.SqlTypes;
    using System.Data.Sql;
    using Microsoft.SqlServer.Server;
     
    namespace UnTest
    {
        [SqlUserDefinedType(
            Format.Native
            , IsByteOrdered = false
            , IsFixedLength = true
        )]
        [Serializable]
        public struct Prix : INullable
        {
            private SqlMoney prixHT;
     
            public SqlMoney PrixHT
            {
                get
                { return prixHT; }
                set
                {
                    prixHT = value;
                    Update();
                }
            }
     
            private SqlSingle tauxTVA;
     
            public SqlSingle TauxTVA
            {
                get
                { return tauxTVA; }
                set
                {
                    tauxTVA = value;
                    Update();
                }
            }
     
            private SqlMoney prixTTC;
     
            public SqlMoney PrixTTC
            {
                get
                { return prixTTC; }
            }
     
            private void Update()
            {
                isNull = this.prixHT.IsNull || this.tauxTVA.IsNull;
                if (isNull)
                    this.prixTTC = SqlMoney.Null;
                else this.prixTTC = Convert.ToDecimal(Convert.ToSingle(this.prixHT.Value) * (1F + this.tauxTVA.Value));
            }
     
            private bool isNull;
     
            public bool IsNull
            {
                get 
                { return (isNull); }
            }
     
            public override string ToString()
            {
                if (IsNull)
                    return ("NULL");
                else return (string.Format("{0:c} x {1:##0.00%} = {2:c}", this.PrixHT.Value, this.TauxTVA.Value, this.PrixTTC.Value));
            }
     
            public static Prix Parse(SqlString prixstring)
            {
                if (prixstring.IsNull)
                    return (Prix.Null);
     
                try
                {
                    string[] parts = prixstring.Value.Split(':');
                    return (Prix.Nouveau(decimal.Parse(parts[0]), float.Parse(parts[1])));
                }
                catch
                {
                    throw new Exception(string.Format("Format incorrect"));
                }
            }
     
            public static Prix Null
            {
                get
                { return (new Prix()); }
            }
     
            public static Prix Nouveau(SqlMoney prixHt, SqlSingle tauxTva)
            {
                Prix nouveauprix = new Prix();
                nouveauprix.PrixHT = prixHt;
                nouveauprix.TauxTVA = tauxTva;
     
                return (nouveauprix);
            }
     
            public static string Calcul()
            {
                string temp = "je suis passé dans calcul";
     
                return (temp);
            }
        }
    }
    Sachant que j'ai essayé plusieurs types de retour, là c'est le dernier utilisé


    SQL Server
    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
     
    create assembly MonAssembly
    from @'\\PosteMoi\Debug\UnTest.dll'
    with permission_set = safe
    GO
     
    create type Prix
    external name MonAssembly.[UnTest.Prix]
    GO
     
    create schema unschema
    GO
     
    create table unschema.Produit
    (
    code int not null,
    libelle int not null,
    prixproduit Prix not null,
    constraint PK_PRODUIT primary key (code)
    )
    GO
     
    insert into Produit (code, libelle, prixproduit) values (1, 'Produit1', '1500:0,196')
    GO
     
    select prixproduit::Calcul() from unschema.produit
    Et la ça m'affiche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Type prixproduit is not a defined system type
    N'oubliez pas, si votre problème est résolu, mettez le tag
    En informatique, il n'y a pas de problème, toujours des solutions (parfois pas évidentes à trouver )

  6. #6
    Membre habitué Avatar de 1tsiMat
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    139
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 139
    Points : 127
    Points
    127
    Par défaut Solution
    La solution est toute bête ...
    La méthode doit posséder au moins un paramètre ...
    Voilà si ca peut être utile ^^

    Merci d'avoir essayé de m'aider SQL Pro

    Bonne journée à tous
    N'oubliez pas, si votre problème est résolu, mettez le tag
    En informatique, il n'y a pas de problème, toujours des solutions (parfois pas évidentes à trouver )

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Es-tu sûr de ta solution? L'erreur que tu décris un peu plus haut te dit simplement que tu essaies d'appeler une méthode statique (via l'opérateur :. Donc forcément, c'est sur un type que cela s'applique. Or, tu appliques ça à prixProduit qui est une variable, pas un type.

    Tu aurais dû écrire :
    Select Prix::Calcul() As Resultat

    A+

    Pascal Belaud


    Citation Envoyé par 1tsiMat
    La solution est toute bête ...
    La méthode doit posséder au moins un paramètre ...
    Voilà si ca peut être utile ^^

    Merci d'avoir essayé de m'aider SQL Pro

    Bonne journée à tous

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

Discussions similaires

  1. Appel d'une méthode virtuelles
    Par BIPBIP59 dans le forum C++Builder
    Réponses: 4
    Dernier message: 24/03/2006, 14h00
  2. Réponses: 2
    Dernier message: 29/12/2005, 10h25
  3. Réponses: 2
    Dernier message: 06/12/2005, 09h41
  4. Réponses: 6
    Dernier message: 27/05/2005, 15h43
  5. Comment connaitre l'appelant d'une méthode
    Par Alec6 dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 12/07/2004, 14h51

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