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

Accès aux données Discussion :

Insertion de données dans une BDD Oracle avec VB.NET


Sujet :

Accès aux données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Août 2007
    Messages : 26
    Points : 20
    Points
    20
    Par défaut Insertion de données dans une BDD Oracle avec VB.NET
    Bonsoir chers amis développeurs et chères amies développeuses !! C'est un petit souci qui m'amène parmi vous, car aprés avoir passé l'aprem sur msdn library, et aprés avoir écumé le forum, en désespoir de cause, je viens vous embêter et prendre un peu de votre temps pour que vous m'aidiez à voir plus clair dans le code que voici =>

    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
    Private Sub bt_ajout_pays_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt_ajout_pays.Click
     
                Dim pays As String
                pays = zs_ajout_pays.Text
                Dim maConnexion As OracleClient.OracleConnection
                Dim myCommand As OracleClient.OracleCommand
                Dim Requete As String
                Dim ConnexionSQL As String
                ConnexionSQL = "Data Source=PLOP;Persist Security Info=True;User ID=PLIP;Unicode=True"
                maConnexion = New OracleClient.OracleConnection(ConnexionSQL)
                Requete = "INSERT INTO PAYS (NO_PAYS, NOM_PAYS) VALUES (50, @pays)"
                myCommand = New OracleClient.OracleCommand(Requete, maConnexion)
                With myCommand.Parameters
                    .Add(New OracleClient.OracleParameter("50", OracleClient.OracleType.Int16))
                    .Add(New OracleClient.OracleParameter("@pays", OracleClient.OracleType.VarChar))
                End With
                Try
                    myCommand.Connection.Open()
                    myCommand.ExecuteOracleNonQuery(1)
                    myCommand.Connection.Close()
                Catch ex As OracleClient.OracleException
                    Console.WriteLine(ex.Message)
                End Try
                msg = zs_ajout_pays.Text & " a bien été ajouté"
                MsgBox(msg)
                zs_ajout_pays.Clear()
                bt_ajout_pays.Text = "Ajouter"
    End Sub
    C'est simplement un code qui devrait me permettre d'ajouter une ligne dans une table, mais en fait, rien ne se passe
    Je développe sous Visual Studio 2005 (oué sinon je posterais pas ici) en vb.net, et je dois insérer des données dans une base Oracle avec un client oracle8i...

    Si vous arrivez à déceler où j'ai commis une erreur, faites le savoir haut et fort !!!
    D'avance merci

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Bonsoir

    A vue de nez et bien que je ne sois pas exactement un pro de Oracle :

    - ton 50 dans ta chaine doit être remplacé par le nom d'un paramètre. Il ne constitue pas a priori un nom de paramètre valide.

    - Par ailleurs tu ne donne de valeurs à aucun de tes deux paramètres.

    Ca ne peut donc pas marcher.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    effectivement si tu mets "50" en dur dans la requête, tu n'as pas besoin d'un paramètre pour, ça, donc tu peux enlever la ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Add(New OracleClient.OracleParameter("50", OracleClient.OracleType.Int16))
    De plus, sous Oracle les les changements que tu fais sont exécutés dans une transaction: tant que tu n'as pas validé la transaction ("commit"), les changements ne sont pas réellements répercutés dans la base, ils ne sont visibles que dans ta session. Tu peux voir ça comme un fichier que tu modifies, tant que tu n'as pas cliqué sur "enregistrer", le fichier n'est pas modifié. Ici, tu te déconnectes immédiatement de la base sans avoir fait le commit, donc tes modifications disparaissent... ("rollback" implicite).
    Essaie comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                    myCommand.Connection.Open()
                    Dim t as OracleTransaction = myCommand.Connection.BeginTransaction()
                    myCommand.Transaction = t
                    myCommand.ExecuteOracleNonQuery(1)
                    t.Commit()
                    myCommand.Connection.Close()
    EDIT: Celà dit, je me demande si le provider ADO.NET n'est pas en mode "auto-commit", c'est à dire qu'il fait le commit automatiquement avant de se déconnecter... donc ce n'est peut-être pas ça le problème, mais essaie toujours.
    A part ça, cette ligne pose un problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myCommand.ExecuteOracleNonQuery(1)
    Le paramètre de cette fonction est passé par référence (ByRef), donc il faut passer une variable, pas une constante; en plus le paramètre n'est pas un entier, il est de type OracleString. D'ailleurs j'arrive pas à croire que le compilateur laisse passer ça... Encore un des gros défauts de Visual Basic mis en évidence !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim rowid as OracleString
    myCommand.ExecuteOracleNonQuery(rowid)

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Août 2007
    Messages : 26
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Ca ne peut donc pas marcher.
    Ok, je mets donc des valeurs dans mes paramètres,

    tant que tu n'as pas validé la transaction ("commit"), les changements ne sont pas réellements répercutés dans la base
    D'acc, je rajoute donc ce que tu proposes

    A part ça, cette ligne pose un problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    myCommand.ExecuteOracleNonQuery(1)
    Le paramètre de cette fonction est passé par référence (ByRef), donc il faut passer une variable, pas une constante; en plus le paramètre n'est pas un entier, il est de type OracleString
    Houh bin tu vois, là j'apprends un truc ^^




    ce qui donne =>

    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
     
    Private Sub bt_ajout_pays_Click(ByVal... 
     
    Dim pays As String
    pays = zs_ajout_pays.Text 'UNE CHAINE DE TEXTE TAPEE PAR L'UTILISATEUR
    Dim num As Integer
    num = 20 'UN NOMBRE QUE J'AI CHOISI AU HASARD
    ConnexionSQL = "Data Source=BLIP;Persist Security Info=True;User ID=BLOP;Unicode=True"
    maConnexion = New OracleClient.OracleConnection(ConnexionSQL)
    Requete = "INSERT INTO PAYS (NO_PAYS, NOM_PAYS) VALUES (@num, @pays)"
    myCommand = New OracleClient.OracleCommand(Requete, maConnexion)
    With myCommand.Parameters
           .Add(New OracleClient.OracleParameter("@num", OracleClient.OracleType.Int16))
           .Add(New OracleClient.OracleParameter("@pays", OracleClient.OracleType.VarChar))
    End With
    Try
           myCommand.Connection.Open()
           Dim t As OracleClient.OracleTransaction = myCommand.Connection.BeginTransaction()
           myCommand.Transaction = t
           Dim rowid As OracleClient.OracleString
           myCommand.ExecuteOracleNonQuery(rowid)
           t.Commit()
           myCommand.Connection.Close()
           Catch ex As OracleClient.OracleException
           Console.WriteLine(ex.Message)
    End Try
    Mais ça ne marche pas mieux, donc le problème ne vient pas de là

    Petite question... faut-il attribuer une valeur à rowid ?????? Je pense que oui, et si c'est le cas, quelle valeur dois-je lui donner ? J'avoue que je n'ai pas tout à fait compris ce petit point

    En tout cas merci pour vos messages !

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par tomlev Voir le message
    De plus, sous Oracle les les changements que tu fais sont exécutés dans une transaction: tant que tu n'as pas validé la transaction ("commit"), les changements ne sont pas réellements

    Mais pas du tout !!!!

    Ce que tu dis est vrai en cas d'utilisation d'une transaction explicite (comme pour tous les SGBD et ce n'est pas propre à Oracle), mais si tu ne démarre pas une transaction, tu peux faire un update qui sera répercuté à la DB comme avec n'importe quel autre SGBD (enfin pour ceux que je connais : Sql Server, Oracle, PostGre).

    Pour être plus précis, si tu ne déclare pas explicitement une transaction, une transaction implicite est utilisée au niveau de la commande ou de la proc. stoc. (mais encore une fois, tu as le même comportement avec Sql Server ou PostGre - quoique je ne sois pas sur à 100% pour ce dernier).

    .

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Août 2007
    Messages : 26
    Points : 20
    Points
    20
    Par défaut
    Hem hem, je me suis dit que si la requête ne s'executait pas c'était ptet parce que les paramètres qui lui sont passés ont une valeur nulle... du coup l'insert ne se fait pas. Donc j'ai un peu revu le code, mais ça ne marche toujours pas

    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
     
    Dim pays As String
    pays = PAPOUASIE
    Dim num As Integer
    num = 20
    Dim maConnexion As OracleClient.OracleConnection
    Dim myCommand As OracleClient.OracleCommand
    Dim Requete As String
    Dim ConnexionSQL As String
    ConnexionSQL = "Data Source=PLIP;Persist Security Info=True;User ID=PLOP;Unicode=True"
    maConnexion = New OracleClient.OracleConnection(ConnexionSQL)
    Requete = "INSERT INTO PAYS (NO_PAYS, NOM_PAYS) VALUES (" & num & " , '" & pays & "')"
    myCommand = New OracleClient.OracleCommand(Requete, maConnexion)
    Try
     myCommand.Connection.Open()
     Dim t As OracleClient.OracleTransaction = myCommand.Connection.BeginTransaction()
     myCommand.Transaction = t
     Dim rowid As OracleClient.OracleString
     rowid = New OracleClient.OracleString
     myCommand.ExecuteOracleNonQuery(rowid)
     t.Commit()
     myCommand.Connection.Close()
    Catch ex As OracleClient.OracleException
     Console.WriteLine(ex.Message)
    End Try
    Le code s'execute sans planter mais il ne se passe rien... Jcomprend pas.
    Siouplait, si vous avez une idée de génie, je suis preneur XD

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Mais pas du tout !!!!

    Ce que tu dis est vrai en cas d'utilisation d'une transaction explicite (comme pour tous les SGBD et ce n'est pas propre à Oracle), mais si tu ne démarre pas une transaction, tu peux faire un update qui sera répercuté à la DB comme avec n'importe quel autre SGBD (enfin pour ceux que je connais : Sql Server, Oracle, PostGre).

    Pour être plus précis, si tu ne déclare pas explicitement une transaction, une transaction implicite est utilisée au niveau de la commande ou de la proc. stoc. (mais encore une fois, tu as le même comportement avec Sql Server ou PostGre - quoique je ne sois pas sur à 100% pour ce dernier).

    .
    Ben je sais pas, dans mon environnement de travail (Oracle 9, Solaris 9) le commit n'est pas implicite... si je me déconnecte sans commit, les modifs sont perdues.

    Houh bin tu vois, là j'apprends un truc
    ben il suffisait de regarder la doc, je l'ai pas sorti d'un chapeau

    Petite question... faut-il attribuer une valeur à rowid ?????? Je pense que oui, et si c'est le cas, quelle valeur dois-je lui donner ?
    Non, rowid est un paramètre de sortie de la fonction ExecuteOracleNonQuery, c'est à dire que c'est la fonction qui donne une valeur à la variable. Et c'est pour ça qu'il faut passer une variable et non une valeur littérale...
    Le rowid est l'identifiant interne d'une ligne, généré par Oracle, et tu ne peux pas choisir toi-même la valeur

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Août 2007
    Messages : 26
    Points : 20
    Points
    20
    Par défaut
    Bon j'ai trouvé d'où venait l'erreur... L'ouverture de la connexion n'aurait pas du se trouver dans le Try : au moins j'aurais vu qu'il n'y avait pas le mot de passe dans la chaine de connexion ^^ Vraiment débile comme erreur... Merci quand même de votre aide.


    Voici le code corrigé, ça pourra peut-être aider des gens

    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
     
    Dim maConnexion As OracleClient.OracleConnection
    Dim myCommand As OracleClient.OracleCommand
    Dim Requete As String
    Dim ConnexionSQL As String
    Dim no as Integer
    Dim pays as String
     
    ConnexionSQL = "chaine de connexion"
    maConnexion = New OracleClient.OracleConnection(ConnexionSQL)
    Requete = "INSERT INTO PAYS (NO_PAYS, NOM_PAYS) VALUES (" & no & " , '" & pays & "')"
    myCommand = New OracleClient.OracleCommand(Requete, maConnexion)
    myCommand.Connection.Open()
    Try
    myCommand.ExecuteNonQuery()
    Catch ex As OracleClient.OracleException
    Console.WriteLine(ex.Message)
    End Try
    myCommand.Connection.Close()
    msg = "Le pays " & zs_ajout_pays.Text & " a bien été ajouté"
    MsgBox(msg)
    Par contre, une petite question encore : sauriez vous comment récuperer le résultat d'une requete de sélection dans une variable ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ConnexionSQL = "chaine de connexion"
    maConnexion = New OracleClient.OracleConnection(ConnexionSQL)
    Requete = "SELECT MAX(NO_PAYS)AS NUM FROM PAYS"
    myCommand = New OracleClient.OracleCommand(Requete, maConnexion)
    myCommand.Connection.Open()
    Try
     myCommand.ExecuteNonQuery()
     
     'RECUPERER LE RESULTAT DE LA REQUETE ET LE METTRE DANS UNE VARIABLE...
     
     Catch ex As Exception
    Console.WriteLine(ex.Message)
    End Try
    je voudrais récupérer le plus grand NO_PAYS et le caler dans une variable... La requête est bonne, il me manque juste un petit coup de pouce

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/01/2013, 08h12
  2. [Débutant] Problème d'insertion de données dans une BDD sqlserver ce
    Par chinwya dans le forum VB.NET
    Réponses: 2
    Dernier message: 24/07/2012, 12h29
  3. Problème INSERTION de données dans une bdd
    Par kiradeus dans le forum Django
    Réponses: 12
    Dernier message: 15/02/2010, 18h06
  4. Insertion de données dans une BDD Access
    Par LeMeD dans le forum VB.NET
    Réponses: 2
    Dernier message: 25/01/2010, 16h43
  5. Réponses: 5
    Dernier message: 06/02/2008, 16h01

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