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

VB.NET Discussion :

[ADO.NET] Lecture d'une clé primaire


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Points : 11
    Points
    11
    Par défaut [ADO.NET] Lecture d'une clé primaire (base sql) avec SCOPE IDENTITY
    Je suis confronté à une petite difficulté.

    Je développe une petite application de gestion de dossiers utilisant un treeview ; lorsque l'utilisateur veut ajouter un dossier, je crée une nouvelle ligne dans la base de données et un nouveau noeud dans le treeview.

    Je souhaiterais affecter la valeur de la clé primaire (auto-incrémentée) de la nouvelle ligne à la propriété Tag de mon noeud.

    Or, au moment où je crée la ligne dans la base de donnée, il m'est impossible de lire cette valeur (j'ai toujours "-1" en retour).

    Idéalement, j'aimerais pouvoir lire cette valeur avant l'update (j'imagine que le moteur de base de données à déjà dû la définir à ce moment) mais après ça va aussi, si je suis sûr qu'il s'agit bien de la clé primaire de ma nouvelle ligne.

    Voici le code qui crée la ligne (rien d'extraordinaire) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ObjetDataRow = frmMain.DossiersDataSet.Tables("Dossiers").NewRow()
     
    ObjetDataRow("Dossier") = "Nouveau dossier..."
     
    frmMain.DossiersDataSet.Tables("Dossiers").Rows.Add(ObjetDataRow)
     
    frmMain.DossiersTableAdapter.Update(frmMain.DossiersDataSet.Dossiers)
    Quelle instruction dois-je utiliser et à quel moment pour avoir la valeur de la clé primaire qui figurera en définitif dans la table ?

    Ou pour résumer, comment retrouver avec certitude ma ligne dans la base de données (dans la cas où d'autres auraient été créées par un autre utilisateur entre temps) ??

    D'avance merci

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Tu vas devoir modifier l'InsertCommand de ton DataAdapter.
    Et me semble-t'il pour certain(s) SGBD gérer un event.

    La modification de l'InsertCommand va dépendre du SGBD utilisé.
    Quel est-il?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Bonsoir,

    J'utilise pour l'instant une base de données SQL server CE 3.5, proposée par défaut par VB.net.

    Mais je n'ai rien contre une base Access si ça peut faciliter les choses !

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Désolé pour SQL server : je ne pratique pas.

    Pour MsAccess,c'est assez simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string MonChampAutoIncrement = "ID" ; 
    MyAdapter.InsertCommand += " " + MonChampAutoIncrement + " = SCOPEIDENTITY()" ;
    MyAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
    Ca aurait été un peu plus compliqué en MySQL et Oracle.

    PS: c'est sans rapport avec la question, mais n'oublie pas de faire frmMain.DossiersDataSet.Tables("Dossiers").AcceptChanges() après l'Adapter.Update().

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Merci pour la réponse !

    Je digère tout ça, fais les modifs nécessaires et je reviens

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 948
    Points : 1 111
    Points
    1 111
    Par défaut
    je confirme qu'il s'agit de rajouter la commande SCOPE IDENTITY dans la requete SQL, et SCOPE IDENTITY est disponible sur SQL server (qui est mieux qu'access en tant que base de données, si tu as commencé sur SQL server ce serait domamge de repasser en access).

    la définition sur MSDN :
    http://msdn.microsoft.com/en-us/library/ms190315.aspx

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Bon, c'est vraiment la galère ce VB.net 2008 gratuit de Microsoft...

    Après avoir trouvé la page ci-après qui me semble très intéressante (http://msdn.microsoft.com/en-us/library/ks9f57t0.aspx), voilà que je ne peux pas tester mes modifications.

    En effet, VB me dit que les types SqlDataAdapter, SqlCommand et SqlParameter ne sont pas définis. S'agissant d'une bibliothèque manquante au projet, je me suis rué sur mon menu 'ajouter une référence' bien sûr. Il semble que je doive ajouter System.Data.SqlClient, qui est totalement introuvable, aussi bien dans l'onglet ".net" que dans l'onglet ".com".

    J'ai réinstallé VB.net, sans succès.

    Je désespère, je passe plus de temps à me poser des questions et à chercher comment fonctionne ce produit qu'à programmer.

    La documentation de Microsoft est vraiment extrêmement mal faite ; elle est destinée à des gens qui sont censés déjà tout connaître et ayant une configuration sans faille.

    /coup de blues

  8. #8
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Normalement ce sont de class qui sont dans le framework.
    Tu dois pouvoir y accéder directement avec SqlClient.SqlCommand .
    L'espace de nom complet étant System.Data.SqlClient.SqlCommand
    Dur dur les débuts hein

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Oui, dur dur, mais merci de m'aider

    J'ai résolu mes problèmes de Types non défini ; maintenant, pas moyen de définir la valeur de connectionstring visée dans la page de Microsoft et dans quantité d'exemples sur le net.

    J'ai bien "provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;DATA SOURCE=" & nomdelabase qui fontionne quand j'ouvre une connexion ADODB mais visiblement, les critères ne sont pas les mêmes.

    Du coup j'ai essayé de mettre directement dans le TableAdapter la requête INSERT suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO [Dossiers] ([Actif], [Dossier], [Ouverture], [Echeance], [Pret], [Notes]) VALUES (@p1, @p2, @p3, @p4, @p5, @p6)
    SELECT SCOPE_IDENTITY() AS Identifiant
    (Identifiant étant bien sûr ma clé primaire)

    La requête est créée, j'ai laissé le nom par défaut (InsertQuery) mais bon, voilà, je ne suis pas plus avancé snif...

    J'ai un peu honte de quémander des infos comme ça alors qu'il existe douze mille pages sur internet mais j'ai vraiment du mal à trouver un "Les bases sql avec vb.net pour les nuls"...

  10. #10
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Montre nous le code que tu as écris que l'on puisse t'aiguiller
    (Avec les balises code pour la lisibilité)

    Sinon pour le string de connexion, si tu as un doute : http://www.connectionstrings.com/

  11. #11
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Une connection string pour SQL server c'est plutot ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cn.ConnectionString = 
      "Server=server;Database=northwind;UID=login;PWD=password;";
    Si on utilise OleDbProvider, alors OleDbAdapter.

    Sankasss : excellent ton lien

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Bon, il y a visiblement un truc que j'ai pas pigé.

    J'ai fait une tentative on ne peut plus simple de connexion et ça ne fonctionne pas.

    Je résume :

    - base sql CE 3.5 (fichier *.sdf)
    - VB.net Express 2008 installé
    - Framework.net 3.5 aussi

    Et voilà le résultat sur un screenshot :

    http://dumfrog.free.fr/images/SqlConnection.jpg

    Voici le bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim MyConnexion As SqlConnection = New SqlConnection("Data Source=" & dbFile & ";Persist Security Info=False;")
    MyConnexion.Open()
    MsgBox("ok")
    (où dbFile est une variable string contenant l'emplacement du fichier de base de données dans "Mes documents").

    J'ai bien placé, avant la procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Imports System.Data.SqlClient
    Imports System.Data
    'comprends pas

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Ayé, j'ai trouvé pour la connection !

    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Imports System.Data.SqlClient
    Imports System.Data.SqlServerCe
    Et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim MyConnexion As SqlCeConnection = New SqlCeConnection("Data Source=" & dbFile & ";")
    MyConnexion.Open()
    MsgBox("ok")
    Ça fonctionne beaucoup mieux

    Je vais pouvoir m'attaquer sérieusement à ce SCOPE IDENTITY...

  14. #14
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    et avec :
    Microsoft.SQLSERVER.CE.OLEDB.3.5
    Type: OLE DB Provider
    Usage: Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5
    Manufacturer: Microsoft

    Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;Data Source=myPath\myData.sdf;
    vu ici : http://www.connectionstrings.com/sql-server-2005-ce

    ca ne fonctionne pas?

    EDIT : on s'est croisé, bonne chose que tu ailles trouvé...

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Points : 11
    Points
    11
    Par défaut Lecture d'une clé primaire (base sql) avec SCOPE IDENTITY
    Fin du suspense

    Alors, pour commencer, j'ai laissé tomber le format de base de données SQL CE 3.5, qui ne prend pas en compte la fonction SCOPE IDENTITY mais uniquement @@IDENTITY.
    Ne me demandez pas la différence, je suis déjà assez perturbé comme ça

    Je suis donc passé à une base sql tout ce qu'il y a de plus normal (*.mdf).

    Et avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Imports System.Data.SqlClient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            Dim query As String = "Insert Into Dossiers (Dossier) Values (@Dossier);SELECT Scope_Identity();"
            Dim ID As Integer
            Dim connect As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=" & dbFile & ";Integrated Security=True;User Instance=True"
     
            Using conn As New SqlConnection(connect)
                Using cmd As New SqlCommand(query, conn)
                    cmd.Parameters.AddWithValue("@Dossier", "Hellooo les amis")
                    conn.Open()
                    ID = cmd.ExecuteScalar()
                    MsgBox(Str(ID))
                End Using
            End Using
    tout fonctionne à merveille !

    Il y a d'autres méthodes, avec procédure stockée (lien TRÈS utile) mais ce sera pour une prochaine fois.

    Merci à ceux qui m'ont apporté leur aide. Rendez-vous au prochain casse-tête pour newbies de Tonton Bill

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

Discussions similaires

  1. [VB.NET] ADO.NET: update d'une dataset dans une base
    Par Alexj51 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 11/05/2006, 15h48
  2. [ADO.NET]Comment réaliser une relation sur plusieurs champs?
    Par kleomas dans le forum Accès aux données
    Réponses: 3
    Dernier message: 13/03/2006, 12h40
  3. [ADO.Net] Comment réaliser une jointure bindée ?
    Par prophetky dans le forum Accès aux données
    Réponses: 4
    Dernier message: 18/02/2006, 16h17
  4. [ADO.NET] Comment rendre une certaine colonne "AutoIncrement" ?
    Par maitrebn dans le forum Accès aux données
    Réponses: 3
    Dernier message: 23/03/2005, 22h12
  5. [C#] [.NET] Lecture d'une classe dans un fichier
    Par niPrM dans le forum Windows Forms
    Réponses: 4
    Dernier message: 18/05/2004, 08h57

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