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

Contribuez .NET Discussion :

[ADO.Net][1.1/SqlCommandBuilder] Comment résoudre probleme avec le commandText ? [FAQ]


Sujet :

Contribuez .NET

  1. #1
    Rédacteur
    Avatar de cladsam
    Profil pro
    Inscrit en
    Août 2003
    Messages
    1 785
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2003
    Messages : 1 785
    Points : 2 436
    Points
    2 436
    Par défaut [ADO.Net][1.1/SqlCommandBuilder] Comment résoudre probleme avec le commandText ?
    Bonjour,

    je dévleoppe en VB.net sous VS 2003.
    J'utilise un SqlCommandBuilder et je rencontre le problème suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim ada As New SqlDataAdapter
            requet = "select * from [Affaire - Mission]"
            ada.SelectCommand = New SqlCommand(requet, base.GetConnection)
            Dim builder As New SqlCommandBuilder(ada)

    J'obtiens bien les commandes voulues sauf que le début de la commande d'Insert ressemble a ça:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO  Affaire - Mission
    Idem: il ne prend pas en compte le fait que le nom de la Table est composé, et de ce fait ne met pas les [] autour du nom d'ou un joli message "erreur de syntaxe ver -" ... est-ce un énorme Insecte ou bien y a t'il quelque chose a spécifier lorsque le nom de la Table est ainsi composé?

    Merci a qui pourra m'aider ^^

  2. #2
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Interessant ..
    Je pencherai pour un enorme Insecte

  3. #3
    Rédacteur
    Avatar de cladsam
    Profil pro
    Inscrit en
    Août 2003
    Messages
    1 785
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2003
    Messages : 1 785
    Points : 2 436
    Points
    2 436
    Par défaut
    Drôle comme ça ressemble exactement à la réponse que j'avais peur de recevoir
    Dans ces cas la, vu que je n'ai nullement la possibilité de toucher au nom des tables... y a t'il un moyen autre que des atcues genre refaire la debut de la chaine de commande a coup de substring?


  4. #4
    Membre éclairé Avatar de zeavan
    Architect
    Inscrit en
    Avril 2003
    Messages
    590
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Autre

    Informations professionnelles :
    Activité : Architect

    Informations forums :
    Inscription : Avril 2003
    Messages : 590
    Points : 774
    Points
    774
    Par défaut
    quel est l'abr... qui a donner ce nom a ces tables par default sql analyser rajoute automatiquement les crochets donc evidemment tu as des problemes

  5. #5
    Rédacteur
    Avatar de cladsam
    Profil pro
    Inscrit en
    Août 2003
    Messages
    1 785
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2003
    Messages : 1 785
    Points : 2 436
    Points
    2 436
    Par défaut
    Citation Envoyé par Zeavan
    Quel est l'abr... qui a donner ce nom a ces tables
    Sans commentaires disons juste que je suis obligé de faire avec

    MOn probleme continue, pas contrariant et n'ayant pas trouvé d'autre solution je me dis pourquoi ne pas changer le text des commandes du Builder?
    Donc j'essayer ça:

    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
    Private Sub corrigeBuilder(ByRef builder As SqlCommandBuilder)
     
            Dim travail As String
            Dim indexFin As Integer
            Dim ancienNom As String
            Dim nouveauNom As String
     
            travail = builder.GetInsertCommand.CommandText()
            indexFin = travail.IndexOf("(")
            ancienNom = travail.Substring(12, indexFin - 12)
            nouveauNom = "[" & ancienNom & "]"
            travail = travail.Replace(ancienNom, nouveauNom)
     
            builder.GetInsertCommand.CommandText = travail
     
            MsgBox(builder.GetInsertCommand.CommandText)
        End Sub
    Il n'y a qu'un get pour insertcommand du builder pas de set mais pourinsertCommand.commandtext il est ecrit "obtient OU DEFINIT ..." donc je me dis super ça va resoudre mon probleme j'aurai plus qu'à faire pareil pour les 2 autres commandes.

    Pourtant horreur meme si travail contient bien la chain voulue... la command affichée par msgbox ... n'a pas changé, comme si :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    builder.GetInsertCommand.CommandText = travail
    n'avait aucun effet.


    J'ai également essayé ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    builder.DataAdapter.InsertCommand = New SqlCommand(travail)
    ce qui affecte bien une valeur a l'insertCommand du dataAdapter de builder.. mais au moment de procéder a la mise a jour de la base, cette seconde solution me généré une erreur :

    le paramètre @p1 doit être déclaré

    la je bloque

  6. #6
    Membre éclairé Avatar de zeavan
    Architect
    Inscrit en
    Avril 2003
    Messages
    590
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Autre

    Informations professionnelles :
    Activité : Architect

    Informations forums :
    Inscription : Avril 2003
    Messages : 590
    Points : 774
    Points
    774
    Par défaut
    as tu donner une valeur au parametre @p1 ???

    la plus part des strored procedures recoivent des parametres .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GetInsertCommand.paramete["@p1"].Value= [i]maValeurPourP1[/i];

  7. #7
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    salut cladsam
    j'étais justement en train de tester sur ton souci et j'ai essayé tout ce que tu as fait et bien plus mais ya pas de solution; il faut que tu admettes que ce type de nommage est complètement out et dons pas prévu pour tous les cas d'automatisation.
    Considère que tu as à faire à un cas d'exception donc mesure d'exception (se faire payer plus cher ) abandon du builder pour revenir à la configuration manuelle du dataAdapter (ada.DeleteCommand.CommandText =)
    (ada.InsertCommand.CommandText =)
    (ada.SelectCommand.CommandText=)
    (ada.UpdateCommand.CommandText=)

  8. #8
    Rédacteur
    Avatar de cladsam
    Profil pro
    Inscrit en
    Août 2003
    Messages
    1 785
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2003
    Messages : 1 785
    Points : 2 436
    Points
    2 436
    Par défaut
    oui mais ce que je ne comprends pas c'est que dans mon cas je n'utilise pas de procédure stockée mais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    base.UpdateDataSet(DS_InsertionElement, 
       DS_InsertionElement._Affaire___Mission_.TableName, 
       Wrapper_DAABCommande(builder.GetInsertCommand), Nothing, 
       Nothing, UpdateBehavior.Standard)
    Où base est de type Microsoft.Practices.EnterpriseLibrary.data.dataBase

    J'ai deja fait ainsi pour d'autre DataTable pour lesquelles j'avais pa sle probleme de nom..j'ai pas été de sorte ennuyé .. je comprends : : :

  9. #9
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par cladsam
    oui mais ce que je ne comprends pas c'est que dans mon cas je n'utilise pas de procédure stockée mais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    base.UpdateDataSet(DS_InsertionElement, 
       DS_InsertionElement._Affaire___Mission_.TableName, 
       Wrapper_DAABCommande(builder.GetInsertCommand), Nothing, 
       Nothing, UpdateBehavior.Standard)
    Où base est de type Microsoft.Practices.EnterpriseLibrary.data.dataBase

    J'ai deja fait ainsi pour d'autre DataTable pour lesquelles j'avais pa sle probleme de nom..j'ai pas été de sorte ennuyé .. je comprends : : :
    Heu.. as-tu lu ma remarque :

  10. #10
    Rédacteur
    Avatar de cladsam
    Profil pro
    Inscrit en
    Août 2003
    Messages
    1 785
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2003
    Messages : 1 785
    Points : 2 436
    Points
    2 436
    Par défaut
    Citation Envoyé par neguib
    Heu.. as-tu lu ma remarque
    Non je te prie de m'en excuser, a l'heure ou tu l'a spostée je cherchais une référence vers le site de microsoft et la doc de l'enterprise library afain de l'inclure dans mon message , nos message s'étant ainsi croisés je n'ai pas vu ta réponse.


    :trouve:

    Bon une solution je viens d'en trouvée une , tirée par les cheveux comme souvent avec moi mais l'essentiel est d'y parvenir:

    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
    Private Sub corrigeBuilder(ByRef builder As SqlCommandBuilder)
            Dim travail As String
    Dim indexFin As Integer
            Dim ancienNom As String
            Dim nouveauNom As String
            travail = builder.GetInsertCommand.CommandText()
            indexFin = travail.IndexOf("(")
            ancienNom = travail.Substring(12, indexFin - 12)
            nouveauNom = "[" & ancienNom & "]"
            travail = travail.Replace(ancienNom, nouveauNom)
     
     
             For Each parametre As SqlParameter In 
                       builder.GetInsertCommand.Parameters
     
            builder.DataAdapter.InsertCommand.Parameters.Add 
                 (parametre.ParameterName, parametre.SqlDbType, 
                 parametre.Size, parametre.SourceColumn)
     
     
               Next
    end sub


    ce qui recupère dans le builder les commandes correctes avec l'erreur due aux crochets.
    Ensuite recup les parametre du builder dans le dataAdapter.

    Enfin on utilise le dataAdapter dans la requete d'insertion:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    base.UpdateDataSet(DS_InsertionElement, 
       DS_InsertionElement._Affaire___Mission_.TableName, 
       Wrapper_DAABCommande(builder.DataAdapter.InsertCommand), 
       Nothing, Nothing, UpdateBehavior.Standard)
    Et la ca marche reste plus qu'a faire de meme pour les 2 autres commandes et on a une pseudo correction d'Insecte.

    Citation Envoyé par neguib
    il faut que tu admettes que ce type de nommage est complètement out et dons pas prévu pour tous les cas d'automatisation.

    Oui je suis 100% d'accord avec toi , et depusi longtemps seulement c'est un existant Acces que je passe en .net et changé les noms de la sorte lorsque l'on est qu'un petit stagiaire.. ben on nous laisse pas faire


    Citation Envoyé par neguib
    Considère que tu as à faire à un cas d'exception donc mesure d'exception (se faire payer plus cher )
    Stagiaire toujours donc= ne pas se faire payer du tout

  11. #11
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Points : 102
    Points
    102
    Par défaut
    Ptete que créer une vue toutes bêtes aurait suffit non ?

    Quant à faire un code "griboulli" pour tenter de corriger un bug, le plus maintenable aurait sans été de faire les autres commandes à la main et de te passer du Builder, de toute façon faut que tu te les farcices avec un patch. Pense à celui qui passera derrière toi

  12. #12
    Rédacteur
    Avatar de cladsam
    Profil pro
    Inscrit en
    Août 2003
    Messages
    1 785
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2003
    Messages : 1 785
    Points : 2 436
    Points
    2 436
    Par défaut
    Citation Envoyé par cortex93
    Ptete que créer une vue toutes bêtes aurait suffit non ?
    qu'entends tu par faire une vue toute bête?

    Citation Envoyé par cortex93
    Quant à faire un code "griboulli" pour tenter de corriger un bug, le plus maintenable aurait sans été de faire les autres commandes à la main et de te passer du Builder, de toute façon faut que tu te les farcices avec un patch. Pense à celui qui passera derrière toi


    Euh oui mais si je fais de la sorte... ça va en faire de scommandes a générer a la main...parceque cette table au nom composé n'est que la première d'une lognue série.

    ET pour "que tu te les farcices avec un patch..." j'ai pas compris ce que tu voulais dire

  13. #13
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Bien sûr cladsam, c'est déjà bien d'avoir trouver une soluce et encore une fois t'es pas payé assez pour faire mieux qu'eux(confère le nommage ) Et puis Access c'est pas SqlServer donc les pistes de cortex seraient compliquées à réaliser. Retiens tout de même le principe qu'il te file. Faire le max côté SGBD (vues, procedures stockées), tu gagneras enormement en ressources et performances côté appli

  14. #14
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Points : 102
    Points
    102
    Par défaut
    Etant donné que tu utilises les Sql* objets, j'ai pensé, peut-être à tord que tu migrait également la base vers du SqlServer. Je conçois que certaines contraintes soit conservées niveau du schéma de base, mais tu pourrais sans doute demander l'adjonction de quelques vues.
    Un exemple simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE VIEW Affaire_Mission as SELECT * FROM [Affaire - Mission]
    Ainsi, dans ton code tu pourras faire référence a Affaire_Mission exactement comme s'il s'agissait de l'autre table.
    Les vues sont une abstraction plus ou moins simple résultat d'une requête.

    Sinon, après moulte recherche, j'ai peut-être trouvé une jolie boîte pour conserver ton insectes.

    Fais gaffe à la syntaxe, je suis pas VBitien de base.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim ada As New SqlDataAdapter
    requet = "select * from [Affaire - Mission]"
    ada.SelectCommand = New SqlCommand(requet, base.GetConnection)
    Dim builder As New SqlCommandBuilder(ada)
    builder.QuotePrefix = "["
    builder.QuoteSuffix = "]"
    Et voilà, ca rajoute les [ ] un peu partout.

    cortex

  15. #15
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par cortex93
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim ada As New SqlDataAdapter
    requet = "select * from [Affaire - Mission]"
    ada.SelectCommand = New SqlCommand(requet, base.GetConnection)
    Dim builder As New SqlCommandBuilder(ada)
    builder.QuotePrefix = "["
    builder.QuoteSuffix = "]"

  16. #16
    Rédacteur
    Avatar de cladsam
    Profil pro
    Inscrit en
    Août 2003
    Messages
    1 785
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2003
    Messages : 1 785
    Points : 2 436
    Points
    2 436
    Par défaut
    Citation Envoyé par cortex93
    Etant donné que tu utilises les Sql* objets, j'ai pensé, peut-être à tord que tu migrait également la base vers du SqlServer.
    Hum en fait l'appli existante en Access accède a la base qui est déjà du SqlServer, je porte donc l'appli Access en .net et apporte quelques modifs a la base SqlServer dans la limite de ce que je suis autorisé a faire. Quant aux vues, si l'on enlève mon incompétence qui fait que je n'y ai pas pensé, rien ne me l'interdit

    Citation Envoyé par cortex93
    Fais gaffe à la syntaxe, je suis pas VBitien de base.
    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim ada As New SqlDataAdapter 
    requet = "select * from [Affaire - Mission]" 
    ada.SelectCommand = New SqlCommand(requet, base.GetConnection) 
    Dim builder As New SqlCommandBuilder(ada) 
    builder.QuotePrefix = "[" 
    builder.QuoteSuffix = "]"
    Euh ce code remet mes "[" alors il me reste a te dire

    et



    et je vais retourner bosser moi je viens encore d'avoir la preuve que j'en ai besoin

    aussi neguib qui prend pas mal de son temps pour aider les petits gars en détresse comme moi

  17. #17
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Points : 102
    Points
    102
    Par défaut
    De rien, ça fait plaisir

    Pis j'aurais aussi appris un truc, vu que je ne connaissais pas non plus.
    C'est en décompilant le commandBuilder, que j'ai vu qu'il utilisait ça un peu partout, parce que la doc, n'est pas très précise sur ces deux propriétés.

    cortex

  18. #18
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par cortex93
    De rien, ça fait plaisir

    Pis j'aurais aussi appris un truc, vu que je ne connaissais pas non plus.
    C'est en décompilant le commandBuilder, que j'ai vu qu'il utilisait ça un peu partout, parce que la doc, n'est pas très précise sur ces deux propriétés.

    cortex
    futé c'est qui travaille du cortex

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

Discussions similaires

  1. [ADO.Net/C# 2.0]Comment coder ObjectDataSource pour Design?
    Par NeoMan dans le forum Accès aux données
    Réponses: 3
    Dernier message: 22/02/2006, 15h04
  2. [ADO.Net][C#/SQL 2005] Comment faire INSERT avec variable ?
    Par hduchemin dans le forum Accès aux données
    Réponses: 1
    Dernier message: 25/01/2006, 17h34
  3. [ADO.Net][C# 1.1] Comment utiliser OracleDataAdapter ?
    Par misa dans le forum Accès aux données
    Réponses: 2
    Dernier message: 25/01/2006, 13h26
  4. [ADO.Net][C# 2.0]Comment récupérer nom colonne PrimaryKey?
    Par superbobo dans le forum Accès aux données
    Réponses: 1
    Dernier message: 18/01/2006, 17h34
  5. [ADO.Net][C# 1.1]Comment réaliser relation pour 2 Dataset ?
    Par misa dans le forum Accès aux données
    Réponses: 2
    Dernier message: 07/01/2006, 06h55

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