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

Bases de données Delphi Discussion :

Delphi XE5 procédures Sockées Transact-SQL data type


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Billets dans le blog
    4
    Par défaut Delphi XE5 procédures Sockées Transact-SQL data type
    Bonjour


    dans ma procédure j'ai un paramètre @ID_Sites integer,

    j'essaie de lui passer une valeur depuis un FdSoredProcedure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        Param.Name := '@ID_Sites';
        Param.ADDataType:=dtUInt64;
        Param.Value := 0;
    J'ai le choix entre
    dtSByte, dtInt16, dtInt32, dtInt64, // signed int
    dtByte, dtUInt16, dtUInt32, dtUInt64, // unsinged int
    Rien ne fonctionne
    ---------------------------
    Vulcain_logistique
    ---------------------------
    [FireDAC][Phys][ODBC]-338. Param [@ID_Sites] type changed from [ftInteger] to [ftByte]. Query must be reprepared. Possible reason: an assignment to a TFDParam.AsXXX property implicitly changed the parameter data type. Hint: use the TFDParam.Value or appropriate TFDParam.AsXXX property.
    ---------------------------
    OK
    ---------------------------
    Une idée ?

    Cordialement

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 599
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    Le @ devant le nom m'interpelle ! généralement un paramètre se reconnait avec son : devant

    en tout cas c'est ainsi que Firedac reconnait qu'il s'agit d'un paramètre

    Comme j'ai déjà des @ dans certains SQL/SGBD je n'ose trop m'avancer en tout cas une chose est sure on ne met pas le caractère quand on se réfère ensuite au nom du paramètre
    exemple :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TABLE WHERE MONCHAMP=:MONCHAMP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FDQuery.ParamByName('MONCHAMP').asInteger:=10;
    il en va de même pour les procédures
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM MAPROCEDURE(:UNCHAMP,:DEUXCHAMP)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    FDQuery.ParamByName('UNCHAMP').asInteger:=10;
    FDQuery.ParamByName('DEUXCHAMP').asString:='TOTO';
    Pour un FdStoredProc normalement une fois le nom de la procédure indiquée les paramètres (en mode Design) sont préparés, il serait bon de faire un test en ce sens pour vérifier. (je n'ai pas de SGBD qui nomme ses paramètres avec des @ , ça ne viendrait pas de PHP ça ?)

    en mode runtime , on renseigne le nom de la procédure puis on fait un prepare pour avoir les types de champs

  3. #3
    Membre chevronné
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Billets dans le blog
    4
    Par défaut @ precede les paramètres des procédures stockées Microsoft SQLServeur
    Bonjour

    J'ai essayer avec un Query
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from MonShema.Maprocedure
    Mais dans ce cas la MonShema.Maprocedure, j'ai une erreur : n'est pas un objet connu(de mémoire)

    Avec un FdSoredProcedure, j'arrive plus loin.

    notez, que je ne sais pas exactement comment on récupère une table renvoyée par la procédure stockées.
    Je tâtonne.

    Cordialement

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 599
    Billets dans le blog
    65
    Par défaut
    Re,

    MSQLServer , mais bon dieu oui bien sûr aurait dit le commissaire Bourel dans les 5 dernières minutes. Il n'empêche que pour récupérer des données d'une procédure stockée contenant des paramètres en entrée et renvoyant des données, avec Firedac la syntaxe sera bien SELECT * (ou liste des champs) FROM PROCEDURE(liste des paramètres d'entrées) comme indiqué en code SQL n°2 de ma réponse précédente.

    Les noms des paramètres seront précédés de ':' et non d'un @ (qui lui vient de la syntaxe de MSSQL)

    dans votre cas, à priori je vous propose le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    FDQuery.UnPrepare; // si jamais la requête était déjà préparé par exemple
    FDQuery.Close;       // si déjà ouverte 
    FDQuery.SQL.Text:='SELECT * FROM maprocedure(:id); // remarquer que je n'ai pas forcément utilisé le nom du paramètre MSSQL
    FDQuery.Prepare; // optionnel mais un plus 
    FDQuery.ParamByName('ID').asInteger:=0;
    FDQuery1.Open; 
    ....
    FDQuery1.Close;

  5. #5
    Membre chevronné
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Billets dans le blog
    4
    Par défaut On reprend à zéro
    bonjour
    ( je reprends avec cette aide :http://docwiki.embarcadero.com/RADSt...ures_(FireDAC))
    soit une procédure stockée sur Microsoft Serveur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE PROCEDURE vulcain.test
    AS
    BEGIN
      /* Procedure body */
        create table #V_Prix(Id_Transporteur varchar(20),Prix_HT NUMERIC(15,4) ,Prix_Details varchar(100))
     
      INSERT INTO #V_Prix VALUES (N'toto', 526.58, 'blabla');
      INSERT INTO #V_Prix VALUES ('Dupont', 530.58, 'blabla');
      INSERT INTO #V_Prix VALUES (N'Durand', 450, 'blabla');
     
      select * from #V_Prix
    END
    pas de paramètres, juste un retour de table
    Nom : result.jpg
Affichages : 479
Taille : 23,6 Ko

    Le code delphi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      FDQuery1.SQL.Clear;
      FDQuery1.SQL.Add('vulcain.test;');
     
      try
      FDQuery1.Prepare;
        FDQuery1.Open;
        ShowMessage('cool');
    le résultat, pas d'erreur mais aucunes données affichées.
    Nom : vide.jpg
Affichages : 441
Taille : 7,5 Ko

    Voilà pour le fdQuery, à ce stade pas de paramètre, mais pas bon.

    Je reviens à mon fdstoredproc, sur la procédure vulcain.Test Idem que le fdQuery

    je suis bloqué.

    Cordialement

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 599
    Billets dans le blog
    65
    Par défaut
    je ne suis pas assez sur de moi, ne connaissant pas SQLServer mais à mon avis il manque quelque chose :koi : les paramètres de sorties et de surcroit étant donné que vous voulez un ensemble de résultat , une boucle .
    En fait, le code de votre procédure stockée ressemble plus à un script SQL qu'à une procédure stockée.

    En bref, j'ai l'impression que c'est votre procédure stockée qui bat de l'aile et non Firedac

    la même procédure en Firebird donnerait ceci :

    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
    CREATE PROCEDURE vulcain.test
    RETURNS ( ID VARCHAR(20),
                     PRIX NUMERIC(15,4),
                     DETAIL VARCHAR(100)
                   )
    AS
    BEGIN
      /* Procedure body */
        create table #V_Prix(Id_Transporteur varchar(20),Prix_HT NUMERIC(15,4) ,Prix_Details varchar(100))
     
      INSERT INTO #V_Prix VALUES ('toto', 526.58, 'blabla');
      INSERT INTO #V_Prix VALUES ('Dupont', 530.58, 'blabla');
      INSERT INTO #V_Prix VALUES ('Durand', 450, 'blabla');
      for   select * from #V_Prix INTO :ID,:PRIX,:DETAIL DO SUSPEND;
    END

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

Discussions similaires

  1. pb SQL data type unknown
    Par Chayanne47 dans le forum Bases de données
    Réponses: 4
    Dernier message: 10/03/2009, 14h36
  2. [Transact-SQL] Optimisation d'une procédure stockée
    Par Shinn77 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 25/06/2007, 12h30
  3. Procédure stockée, transact SQL et param de type INT
    Par Samish dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/04/2006, 10h01
  4. [SQL Server] Error converting data type varchar...
    Par Sir Tengu dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 13/06/2003, 10h46

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