none
Probleme de base de données RRS feed

  • Question

  • Bonjours, c'est encore moi ^^


    Alors voila, j'utilise la base de données de visual studio, je n'ai pas le choix ^^

    Il y a quelque chose que je ne comprends pas, j'arrive à lire des données que j'ai rentré manuellement dans la BDD et à les afficher dans mon formulaire, mais je n'arrive pas à insérer des données via une requete sql qui prends les données du formulaire, je n'ai pas de message d'erreur, mes données ne s'enregistre tout simplement pas.


    Si quelqu'un pouvait me dire pourquoi ^^


    Merci d'avance.


    Le code pour insérer :

     

     Dim Connection As SqlConnection = New SqlConnection()
            Connection.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\MonEntreprise.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
            Connection.Open()
    
    
    
            Dim nom As String = txt_nom.Text
    
    
            'Execution de la requete d'insertion pour Client
            Dim SQL1 As SqlCommand = New SqlCommand("INSERT INTO Client( NomClient, PrenomClient, AdresseClient, CpClient,LocaliteClient, TelephoneClient, GSMClient)VALUES('" & nom & "',' " & txt_prenom.Text & "','" & txt_adresse.Text & "','" & txt_cp.Text & "', '" & txt_localite.Text & "',' " & txt_telephone.Text & "',' " & txt_GSM.Text & "')", Connection)
            Dim DataReader As SqlDataReader
            DataReader = SQL1.ExecuteReader()
            DataReader.Close()

    Pour ce qui est de la connexion, je rentre exactement la meme ligne pour lire les données.

    lundi 25 juin 2012 12:50

Réponses

  • Bonjour,

    Voici le code traduit en VB.NET:

        // Set Processing Mode
        reportViewer1.ProcessingMode = ProcessingMode.Remote
    
        // Set report server and report path
        reportViewer1.ServerReport.ReportServerUrl = new Uri("http://myservername/reportserver")
        reportViewer1.ServerReport.ReportPath = "/AdventureWorks Sample Reports/Company Sales"
    
        // Add the reportviewer to the form
        reportViewer1.Dock = DockStyle.Fill
    
        // Process and render the report
        reportViewer1.RefreshReport()


    fred on youTube
    PHP MySQL Web Site Creator
    fred


    • Modifié fred75 jeudi 28 juin 2012 17:32
    • Marqué comme réponse inouekun jeudi 28 juin 2012 17:53
    jeudi 28 juin 2012 17:31

Toutes les réponses

  • Bonjour inouekun,

    Sql est loin d'être ma tasse de thé, mais n'est il pas étrange d'utiliser un DataReader, pour écrire ?

    peut être regarder : SqlTransaction


    Cordialement, Jacques

    lundi 25 juin 2012 13:06
  • Bonjour,

    C'est une base de données SQL Server (Express) pas "Visual Studio" (même si on peut utiliser VS pour modifier la base).

    Un problème classique est de ne pas vérifier le bon fichier. Si le fichier MDF est dans la solution, il est généralement copié vers la sortie (dossier debug ou release) et c'est ce fichier qui est modifié. Le fichier présent dans la solution reste donc effectivement inchangé (et je soupçonne que c'est ce fichier que l'on vérifie). En plus il est possible éventuellement d'écraser systématiquement le fichier présent dans debug ou release à chaque lancement selon la propriété du fichier dans la solution (http://msdn.microsoft.com/fr-fr/library/0c6xyb66(v=vs.80).aspx propriété CopyToOuputDirectory).

    Vérifier si un autre fichier MonEntreprise.mdf n'est pas présent donc notamment dans le dossier debug ou release de l'appli et vérifier ce fichier.

    Accessoirement comme indiqué par Jacques, ExecuteReader est destiné à la lecture d'un jeu de résultat. Ici ExecuteNonQuery serait sans doute plus approprié même si cela fonctionne peut-être tout de même avec un "reader".


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    lundi 25 juin 2012 13:22
    Modérateur
  • Bonjour,

    3 remarques :

    1) Pour exécuter ton SQL, il te suffit d'écrire :

    SQL1.ExecuteNonQuery

    Tu n'as pas besoin d'un objet DataReader.

    2) Tu utilises une méthode d'accès aux données plutôt ancienne. Tu peux, bien plus facilement, créer un datagridview sur ta form et le binder directement aux données via un BindingSource. PLus de SQL, plus de connection, tout est automatiquement géré.

    Des videos, pour te lancer :

    http://msdn.microsoft.com/en-us/vstudio/bb643825

    http://msdn.microsoft.com/en-us/vstudio/bb643826

    3) Si tu décides de continuer à utiliser la méthode ConnectionString/SQL Command, tu dois ajouter un SqlParameter pour chacune de tes variables (Nom, Prénom, Adresse,GSM...). Exemple tiré de la library Microsoft :

    Public Shared Sub InsertCurrency(
            ByVal currencyCode As SqlString, ByVal name As SqlString)
            Using conn As New SqlConnection("context connection=true")
                Dim InsertCurrencyCommand As New SqlCommand()
                Dim currencyCodeParam As New SqlParameter("@CurrencyCode", SqlDbType.NVarChar)
                Dim nameParam As New SqlParameter("@Name", SqlDbType.NVarChar)
                currencyCodeParam.Value = currencyCode
                nameParam.Value = name
                InsertCurrencyCommand.Parameters.Add(currencyCodeParam)
                InsertCurrencyCommand.Parameters.Add(nameParam)
                InsertCurrencyCommand.CommandText =
                    "INSERT Sales.Currency (CurrencyCode, Name, ModifiedDate)" &
                    " VALUES(@CurrencyCode, @Name, GetDate())"
                InsertCurrencyCommand.Connection = conn
                conn.Open()
                InsertCurrencyCommand.ExecuteNonQuery()
                conn.Close()
            End Using
        End Sub

    lundi 25 juin 2012 13:30
  • Bonjours,

    @Patrice : J'ai un fichier MonEntreprise dans debug, mais ce n'est pas justement ma base de données ?

    Mais sinon, comment faire pour la vérifier ?

    (J'ai tenté excucuteNonQuery, ca ne fonctionne pas ^^)

    Merci de m'aider,

    lundi 25 juin 2012 13:34
  • @Sygrien : Je ne comprends pas ton bout de code :/

    D'où viennent currencyCode et name ?

    Et pourquoi est-on obligé de passer par sqlParameter ?

    (Peux-tu me passer un lien vers la library Microsoft d'où vient l'exemple stp ^^)




    lundi 25 juin 2012 13:49
  • Plutôt que de constituer ta ligne de SQL en mettant bout à bout tes variables, tu utilises des paramètres.

    Je t'ai donné un exemple qui utilise deux variables : currencyCode et name. Dans ton cas, il en faut 5 ou 6 : nom, prénom, adresse, GSM,etc.. Pour chaque paramètre, tu définis son nom et son type, puis tu lui attribues sa valeur.

    Ceci te permet d'éviter une SQL injection.

    Je ne savais pas que tu utilisais une base de données locale. Comme te l'explique Patrice, le système crée une copie de ta base de données dans le répertoire d'exécution (debug). C'est dans cette copie que sont portées les modifications. Si donc tu regardes dans ta base de données originale, tu ne risque pas de les trouver.

    lundi 25 juin 2012 13:57
  • Et comment je fais pour lire les données ?

    Car si ça s'enregistre autre part, ça pose problème pour la lecture des données.

    • Marqué comme réponse inouekun lundi 25 juin 2012 15:23
    • Non marqué comme réponse inouekun lundi 25 juin 2012 15:23
    lundi 25 juin 2012 14:03
  • Je dirais exceptionnellement prendre ce fichier et écraser le fichier actuellement présent dans la solution ce qui permettrait de le vérifier sans doute exactement de la même façon que tu le fais actuellement quitte à effacer les données une fois la vérif effectuée ?

    Ou tout simplement ouvrir le fichier avec SQL Server Management Studio (je ne sais pas si c'est toi dont le prof dit ne pas vouloir qu'on l'utilise pour je ne sais quelle raison ?)

    Ou encore compter les lignes avant/après l'insertion ou afficher les lignes existantes dans une grille ce qui devrait suffire à se rassurer (par exemple pour compter SELECT COUNT(*) FROM Client avec un ExecuteScalar qui retourne la valeur de la 1ère colonne de la 1ère ligne)

    Quand qq chose ne fonctionne pas toujours être explicite. "Ne fonctionne pas" pourrait aussi bien vouloir dire que l'on a un message d'erreur à la compilation ou à l'exécution ou que l'on vérifie toujours le fichier présent dans la solution et que cela ne change rien (ce qui ne me semble pas surprenant).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    lundi 25 juin 2012 14:11
    Modérateur
  • Pour lire ta base de données du répertoire debug, utilises Management Studio ou directement Visual Studio. Ceci te permetra de t'assurer que tes données sont bien écrites.

    Dans ta solution (dans Visual Studio), clique sur ton fichier de bases de données et repère la propriété "CopyToOutput". Si cette propriété vaut "Copy Always", alors, à chaque lancement de ton application, ta base de données originale écrase la base de données du répertoire debug. Donc tu écrases tes modifs à chaque fois. Tu peux choisir la valeur "Copy if Newer" ou encore "Never Copy". Dans ces cas, tu dois pouvoir relire les données que tu as précédemment saisies.

    lundi 25 juin 2012 14:11
  • @patrice : oui je suis celle dont le maitre de stage ne veut pas management ^^'

    Pour le ne fonctionne pas, j'avais expliqué le probleme plus haut ^^ alors je me disais pas besoin, ça ne fonctionne pas dans le sens que ça ne s'enregistre pas dans la BDD.

    @Sygrien : quand je mets sur ne jamais copier, j'ai un message d'erreur qui est :

    Échec d'une tentative d'attachement
     d'une base de données nommée automatiquement pour
     le fichier C:\Users\Adrien\Documents\Visual Studio 2008\Projects\Entreptrise\Entreptrise\bin
    \Debug\MonEntreprise.mdf.
     Il existe une base de données
     du même nom ou le fichier spécifié ne peut être ouvert ou
     il se trouve sur un partage UNC.

    Alors si tu sais comment faire ^^

    Merci de bien vouloir m'aider

    Inouekun

    • Modifié inouekun lundi 25 juin 2012 15:55 mise en page
    lundi 25 juin 2012 14:28
  • Bonsoir,

    S'il s'agit d'un projet à but éducatif, je ne vois pas l'intérêt pour moi de répondre. Qui va recevoir le diplôme ? Toi ou moi ?

    lundi 25 juin 2012 16:48
  • 1) Ok, je pense que cela enregistre correctement mais que l'on ne vérifie pas le bon fichier.

    2) Premier réflexe : vérifier que le fichier est bien présent à cet emplacement. Je crains que "ne jamais copié" ne supprime les fichiers puis ne copie le fichier d'où échec. Sinon vérifier avec SSMS, le principe du "AttachDbFileName" est d'attacher le fichier au "moteur" de la base de données ce qui ne sera pas possible que si une base de même nom n'est pas déjà attachée. Cela peut par exemple sans doute arriver si on va voir la base avec VS (ce qui attache donc le fichier) puis que l'on lance l'application (la base ayant donc été déjà attachée avec VS).

    Je ne sais pas quelles sont les contraintes que l'on a mais je suggérerais :
    - revenir à l'étape 1
    - il n'est pas censé y avoir une interface utilisateur permettant de modifier les données existantes ? Si oui, le faire ce qui permettra de bien voir dans l'appli si les données sont oui ou non insérées correctement

    Pour l'instant j'ai l'impression que l'on génère plus de problèmes en essayant de vérifier quelque chose alors que l'on n' a pas particulièremen prouvé que cela ne marche pas.

    Si l'appli ne génère aucune erreur et que ExecuteNonQuery retourne la valeur 1, pour moi cela prouverait plutôt que l'insertion a bien été faite. Comme je disais on pourrait aussi ajouter une requête qui compterait le nom de lignes ce qui donnerait encore un indice supplémentaire sur le bon fonctionnement...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    lundi 25 juin 2012 17:02
    Modérateur
  • Le truc, c'est que ça enregistre, mais si je ferme visual basic, toutes les données sont perdues, elles s'effacent, et ça pose problèmes.

    (Je le sais car j'ai un liste déroulante qui affiche les type d'appareil, et elle m'affiche ce qui est enregistré, mais si je ferme visual, elle n'affiche plus les valeurs)

    Et le fichier se trouve bien là où l'emplacement le dis, j'ai une BDD monEntreprise a la racine, et une autre dans bin/debug

    @Sygrien : Je fais tout le projet, si je ne le finis pas, personne ne le finira, alors, merci de dire que ça ne sert a rien de m'aider, ça fait plaisir.

    Je pensais que ça servait à ça les forums d'aide, à aider, et saches que j'ai cherché avant de demander de l'aide, j'ai beaucoup chercher, même durant mes heures de temps libre, si je vous demande de l'aide, c'est que je ne sais plus quoi faire.

    lundi 25 juin 2012 17:23
  • Comment sait on que les données sont effacées ? Comme je disais si on a aucune erreur et que ExecuteNonQuery retourne 1 il est plus probable que :
    - soit on ne vérifie pas le bon fichier
    - et/ou le bon fichier est écrasé au prochain lancement de l'application

    Essayez qq chose comme comme (non testé) :

    Dim Connection As SqlConnection = New SqlConnection()
            Connection.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\MonEntreprise.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
            Connection.Open()
    
    
            Dim cmdCount As new SqlCommand("SELECT COUNT(*) FROM Client",Connection)
    
    
            Dim nom As String = txt_nom.Text
    
    
            'Execution de la requete d'insertion pour Client
            Dim SQL1 As SqlCommand = New SqlCommand("INSERT INTO Client( NomClient, PrenomClient, AdresseClient, CpClient,LocaliteClient, TelephoneClient, GSMClient)VALUES('" & nom & "',' " & txt_prenom.Text & "','" & txt_adresse.Text & "','" & txt_cp.Text & "', '" & txt_localite.Text & "',' " & txt_telephone.Text & "',' " & txt_GSM.Text & "')", Connection)
            MessageBox.Show(cmdCount.ExecuteScalar.ToString)
            ' Si 1 à priori ok
            MessageBox.Show(SQL1.ExecuteNonQuery.ToString)
            MessageBox.Show(cmdCount.ExecuteScalar.ToString)
            Sql1.Dispose
            Connection.Close
    

    L'idée est de compter le nombre de lignes dans la table avant insertion, d'afficher le nombre de lignes affectées par l'instruction, et d'afficher le nombre de lignes après insertion. Cela devrait permettre de voir si oui ou non l'insertion se fait bien dans la table.

    On devrait donc voir n, 1, n+1. Si on lancement suivant on a n+1, 1, n+2 tout fonctionne normalement. Si on a n, 1, n+1 c'est que le fichier est écrasé. Vérifier que l'on utilise par exemple "Copier si plus récent" et ne pas ouvrir le fichier présent dans VS si on ne veut pas remettre les données à 0 au prochain lancement...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    lundi 25 juin 2012 17:41
    Modérateur
  • Bonjour,

    Je te conseille de suivre l'atelier 5 du coach VB

    Cela te donnera plus une meilleur compréhension sur les BDD


    fred on youTube
    PHP MySQL Web Site Creator
    fred

    lundi 25 juin 2012 17:41
  • @ Patrice Scribe : ça m'a mis 0, puis 1.

    J'ai refait, ca m'a mit 1 puis 2.

    Et ainsi de suite.

    Mais si je ferme visual, ça retombe à 0

    lundi 25 juin 2012 18:24
  • Et donc sur le fichier on a quoi ?  A priori le fichier base de données est en "copier toujours" ce qui écrase le fichier à chaque fois que l'on lance VS...

    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    mardi 26 juin 2012 08:00
    Modérateur
  • J'ai fait un lien directement à la BDD dans debug, ça enregistre et tout, mais quand je ferme et rouvre vs, ça écrase les anciennes données, alors c'est pas tres pratique ^^

    Sinon, j'ai recréé ma base de données pour vérifié que je n'avais pas fait  d'erreur durant la conception, ça n'a pas non plus l'air d'être ça.

    Après, je sèche, je ne sais pas du tout quoi faire.

    mardi 26 juin 2012 08:19
  • Je vais tenter avec SSMS, est-ce que tu aurais un lien que tu pourrais me passer pour le télécharger, car j'ai du mal à trouver une bonne version
    mardi 26 juin 2012 08:46
  • Bonjours,

    J'ai finalement décidé d'utiliser SSMS, et ça fonctionne très bien,

    J'ai une autre question, j'ai créé un rapport sous Microsoft SQL server Report Builder et j'aimerai utiliser ce rapport dans mon programme visual studio, mais j'ai beau chercher, je ne comprends pas comment faire x_x

    J'ai créé un nouveau formulaire sous vs et j'ai mis un report viewer dessus, j'ai ensuite mis un chemin vers mon rapport, mais ca ne fonctionne pas,

    Je pense que je m'y suis mal prise, alors si vous aviez la solution, merci ^^

    Inouekun

    mercredi 27 juin 2012 21:43
  • Quelle est la procédure suivie ? Vous avez regardé http://msdn.microsoft.com/fr-fr/library/ms251686(v=vs.80)

    Sinon, toujours indiquer le comportement que vous voyez ou le message d'erreur que vous avez pour que qq puisse comprendre le problème (c'est souvent plus simple de partir du problème et de comprendre ce qui ne va pas pour vous remettre sur les rails que de repartir de zéro et passer du temps à expliquer une procédure qui est peut-être celle déjà suivie et qui retombera peut-être sur le même problème)...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    jeudi 28 juin 2012 09:06
    Modérateur
  • Bonjours,

    c'est ça, mais le probleme, c'est que le code est en C

    Alors si vous pouviez m'aider à le traduire en vb.net car je ne connais rien en C

    // Set Processing Mode
    reportViewer1.ProcessingMode = ProcessingMode.Remote;
    
    // Set report server and report path
    reportViewer1.ServerReport.ReportServerUrl = new 
    Uri("http://myservername/reportserver");
    reportViewer1.ServerReport.ReportPath = "/AdventureWorks Sample Reports/Company Sales";
    
    // Add the reportviewer to the form
    reportViewer1.Dock = DockStyle.Fill;
    
    // Process and render the report
    reportViewer1.RefreshReport();
    
    

    jeudi 28 juin 2012 11:33
  • Bonjour,

    Voici le code traduit en VB.NET:

        // Set Processing Mode
        reportViewer1.ProcessingMode = ProcessingMode.Remote
    
        // Set report server and report path
        reportViewer1.ServerReport.ReportServerUrl = new Uri("http://myservername/reportserver")
        reportViewer1.ServerReport.ReportPath = "/AdventureWorks Sample Reports/Company Sales"
    
        // Add the reportviewer to the form
        reportViewer1.Dock = DockStyle.Fill
    
        // Process and render the report
        reportViewer1.RefreshReport()


    fred on youTube
    PHP MySQL Web Site Creator
    fred


    • Modifié fred75 jeudi 28 juin 2012 17:32
    • Marqué comme réponse inouekun jeudi 28 juin 2012 17:53
    jeudi 28 juin 2012 17:31
  • Merci de votre aide ^^
    jeudi 28 juin 2012 17:53