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

Windows Forms Discussion :

[VB.NET]insert sql server & computed field


Sujet :

Windows Forms

  1. #1
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut [VB.NET]insert sql server & computed field
    Bonjour,

    J'entre directement dans le vif du sujet...

    Je tente d'ajouter un record dans une table sql server. Cette se compose d'un ID (clé primaire incrémentée automatiquement), d'un champ calculé (qui est la concaténation de 3 autres champs) et d'autres champs de différents types.

    J'avais déjà travailler avec les id auto-incrémenté et il suffisait de les "ignorer" lors de l'ajout d'un nouveau record pour que tout se passe très bien.

    Je pensais faire de même avec le champ calculé mais apparemment sql server n'aime pas trop ça. Il m'annonce que le champ en question ne peut être modifié car il s'agit d'un champ calculé ou qu'il est le résultat d'un opérateur d'unification... La bonne blague, je sais bien que c'est un champ calculé (p'tit comique cet sql server ^^).

    Le truc c'est que dans ma routine, j'ai bien pris soin de ne pas attribuer de valeur à ce champ. Je l'ai même mis directement après l'id histoire que les autres puissent rester dans le bon ordre. J'ai aussi tenté de passer la valeur null ou une string vide mais rien n'y fait.

    Help please

    Griftou
    Kropernic

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    et en essayant de nommer les champs

    insert into table (ch3,ch4) values (...)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    C'est déjà ce que je fais.

    En fait pour tout ce qui est accès à la DB (insert, select, update, etc), j'ai fait une dll qui se charge de tout.

    Pour les insert, je dois passer à la fonction de la dll une hashtable (nom du champ;valeur du champ) et le nom de la table. Ensuite la dll s'occupe de construire la requête (rien de bien sorcier). Tout est donc bien nommé comme il se doit.

    D'ailleurs heureusement que j'ai fait ça pcq je viens de voir en plaçant un watch sur cette table en mode débug que VS ne garde pas l'ordre des éléments identiques à celui dans lequel on les ajoute.
    Kropernic

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    et en mettant le champ nullable dans la base ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    C'est automatique pour les champs calculé ça ^^
    Kropernic

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    je viens de faire des tests, sans spécifier le champs avant le values, et meme sans le values j'arrive à insérer des données

    vérifie la requete générée par ta dll avant qu'elle part chez sql server ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Bin je viens de faire des inserts et des updates sur des tables sans champs calculés et ça passe très bien....


    C'est louche...
    Kropernic

  8. #8
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Ma requête semble tout à fait correcte...

    Le problème vient vraiment du fait que je ne sais pas quoi faire avec ce champ calculé. Faut-il en tenir compte dans la requête d'insertion ou non ?
    Kropernic

  9. #9
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    je viens de faire des tests, sans spécifier le champs avant le values, et meme sans le values j'arrive à insérer des données
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Je ne vois pas où tu veux en venir...
    Kropernic

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    tu demande s'il faut en tenir compte et je te dis que j'ai fait des tests et que non

    (j'ai créé une table avec un champ calculé et j'ai réussi des insert)

    que vaut le calcul de ta colonne calculée ?
    dans le pire des cas tu peux le faire en trigger et ca sera plus simple ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Ah ok, j'avais pas compris ça comme ça...

    Voici la formule de mon champ calculé après ajout automatique de parenthèses par management studio :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((((CONVERT([char](3),[siege],(0))+'/')+CONVERT([char](4),[annee],(0)))+'/')+right('000000'+CONVERT([varchar],[id],(0)),(6)))

    J'avais pensé au trigger mais j'ignore totalement comment le mettre en place pour le moment.
    Kropernic

  13. #13
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    pour le trigger c'est simple


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE TRIGGER GestionChampCalculé ON nom_de_la_table
    AFTER INSERT, UPDATE
    AS
    BEGIN
     
            UPDATE nom_de_la_table SET champ_calc = ta_formule
                  FROM nom_de_la_table INNER JOIN INSERTED ON clé(s)
     
    END
    sont à remplacer : nom_de_la_table, champ_calc, ta_formule, et les clés
    si tu as une seule clé primaire, tu fais on inserted.clé = nom_de_la_table.clé, si tu as plusieurs champs clé primaire, il faut faire des AND entre chaque

    AFTER INSERT, UPDATE veut dire après un insert ou après un update
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  14. #14
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Bon j'ai suivi l'idée du trigger mais je ne suis pas encore au point ^^.

    J'ai annulé la formule du champ problématique et je l'ai déclaré comme étant de type char(15). J'ai également autorisé les valeurs nulles puisqu'il ne sera rempli qu'après la ligne (si j'ai bien tout compris).

    Voici le code trigger :

    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
     
    -- ================================================
    -- Template generated from Template Explorer using:
    -- Create Trigger (New Menu).SQL
    --
    -- Use the Specify Values for Template Parameters 
    -- command (Ctrl-Shift-M) to fill in the parameter 
    -- values below.
    --
    -- See additional Create Trigger templates for more
    -- examples of different Trigger statements.
    --
    -- This block of comments will not be included in
    -- the definition of the function.
    -- ================================================
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:		<Author,,Name>
    -- Create date: <Create Date,,>
    -- Description:	<Description,,>
    -- =============================================
    CREATE TRIGGER CreationNumeroFacture
       ON  tb_facture 
       AFTER INSERT
    AS 
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
     
        -- Insert statements for trigger here
    	UPDATE tb_facture SET numFact = ((((CONVERT([char](3),[siege],(0))+'/')+CONVERT([char](4),[annee],(0)))+'/')+right('000000'+CONVERT([varchar],[id],(0)),(6)))
    		from tb_facture INNER JOIN INSERTED ON inserted.id = tb_facture.id
    END
    GO

    Où est-ce que j'ai merdé ? Pour le moment, mon champ reste invariablement null...
    Kropernic

  15. #15
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    tu as mis
    AFTER INSERT au lieu de
    AFTER INSERT, UPDATE

    donc sur un update c'est normal que ton champ ne change pas déjà


    et tu as bien executé le code de création du trigger ? (alter trigger pour le modifier)


    un trigger s'execute soit après (AFTER) soit avant et en remplacement d'une instruction (INSTEAD OF)
    un trigger peut etre lié à 1, 2 ou 3 type de requete parmis INSERT UPDATE et DELETE
    la pseudo table INSERTED contient les données insérées dans le cas d'un insert
    la pseudo table DELETED contient les données supprimées dans le cas d'un delete
    et dans le cas d'un update la table DELETED contient les anciennes valeurs et la table INSERTED les nouvelles
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  16. #16
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Le trigger ne doit s'effectuer que lors de l'ajout d'un record donc ça doit être bon le after insert non ?

    C'est une table sur laquelle ne s'effectuera jamais d'update (quand une facture est faite, c'est mort pour la changer)

    Sinon pour faire le trigger, je passe en fait par le management studio. J'ai donc déroulé le treeview correspond à ma table et j'ai fait un clic droit sur le folder "Triggers" et j'ai choisi l'option "new trigger..."

    Ensuite ça m'a donné un template dans lequel j'ai changé ce qui me semblait adéquat.

    EDIT : Je viens de tilter le schmilblick ! C'est juste le code sql à exécuter pour créer le trigger. J'ai donc essayé mais mes noms de table ne sont pas juste... Il doit manquer des préfixes devant... Je gère ça et je reviens
    Kropernic

  17. #17
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Voilà le code avec les noms de tables correctes

    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
    -- ================================================
    -- Template generated from Template Explorer using:
    -- Create Trigger (New Menu).SQL
    --
    -- Use the Specify Values for Template Parameters 
    -- command (Ctrl-Shift-M) to fill in the parameter 
    -- values below.
    --
    -- See additional Create Trigger templates for more
    -- examples of different Trigger statements.
    --
    -- This block of comments will not be included in
    -- the definition of the function.
    -- ================================================
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:		<Author,,Name>
    -- Create date: <Create Date,,>
    -- Description:	<Description,,>
    -- =============================================
    CREATE TRIGGER CreationNumeroFacture
       ON  facture.dbo.tb_facture 
       AFTER INSERT
    AS 
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
     
        -- Insert statements for trigger here
    	UPDATE facture.dbo.tb_facture SET numFact = ((((CONVERT([char](3),[inserted.siege],(0))+'/')+CONVERT([char](4),[inserted.annee],(0)))+'/')+right('000000'+CONVERT([varchar],[inserted.id],(0)),(6)))
    		from facture.dbo.tb_facture INNER JOIN INSERTED ON inserted.id = facture.dbo.tb_facture.id
    END
    GO
    Seulement maintenant, management studio rale pour les références aux champs dans la formules. Ici on peut voir ma dernière tentative en ayant mis inserted comme préfixe mais ce n'est pas bon non plus. J'ai avant ça essayé avec le préfixe "facture.dbo.tbfacture." mais ça ne lui convient pas non plus.


    J'avoue que je m'y perds un peu...
    Kropernic

  18. #18
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    moi le code m'a l'air bon ... enfin j'ai pas la structure de ta base sous les yeux

    il faut préfixer les champs dans le set
    car vu qu'inserted est un "reflet" de la table sur laquelle est le trigger et qu'il y a une jointure, pour un nom de champ il faut bien préciser
    vu que c'est after, inserted et la table ont les données à jour, donc peu importe le préfixage ...


    préfixer par nombase.dbo. est facultatif par contre
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  19. #19
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Bin comme tu peux le voir, j'ai essayé avec inserted. Avec les crochets je reçois l'erreur "invalid column name" et sans les crochets, je reçois :

    Msg 2108, Level 15, State 1, Procedure CreationNumeroFacture, Line 16
    Cannot create trigger on 'facture.dbo.tb_facture' as the target is not in the current database.
    Pareil si je préfixe avec le truc le nom de la db.dbo.table
    Kropernic

  20. #20
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    oui il faut etre sur la bonne base ... c'est le b-a-ba quand meme ...

    on peut la choisir dans le combobox en haut à gauche de studio management
    ou ecrire USE facture avant tes requetes
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [ADO.Net] Connexion à SQL SERVER 2005
    Par dumser1 dans le forum Accès aux données
    Réponses: 9
    Dernier message: 17/01/2009, 17h37
  2. [vb.net] transaction sql server
    Par iamunknown dans le forum Windows Forms
    Réponses: 9
    Dernier message: 05/02/2006, 17h08
  3. [VB.NET 2005][SQL SERVER 2005] Pb d'insertion en BdD
    Par jhary07 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 02/01/2006, 08h53
  4. Lenteur lors d'une insertion (sql server)
    Par shiners300 dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 16/09/2005, 09h09
  5. [VB.net] Connection SQL server
    Par WriteLN dans le forum Windows Forms
    Réponses: 1
    Dernier message: 19/08/2005, 17h39

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