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

C# Discussion :

C# - Probleme de connexion à la base


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 36
    Par défaut C# - Probleme pour lancer une procédure stockée avec paramètre
    Bonjour à tous, je suis pseudo débutant en C# et je crois que je vais avoir grand besoin de vous !

    Voila mon problème, qui est sans doute très simple mais je m'en sors pas la :

    j'ai une connexion à une base sql server dans une class connexion :

    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
    39
     
    public class connexion
    	{
    		//déclaration de la variable de connexion
    		public static SqlConnection co;
     
    		public connexion()
    		{
    			//
    			// TODO: Add constructor logic here
    			//
    		}
     
    		public static void ConnexionBase ()
    		{
     
    			SqlConnection co = new SqlConnection();
    			string costr= "Data Source=(local);Initial Catalog=JFM-DVD;Integrated Security=SSPI";
     
    			co.ConnectionString = costr;
     
    			try
    			{
     
    				co.Open();
    				MessageBox.Show("Connexion ouverte !!");
    			}
    			catch(Exception ex)
    			{
    				MessageBox.Show("Impossible d'ouvrir la connexion : " + ex.Message);
    			}
    			finally
    			{
    				if (co.State == ConnectionState.Open)
    					co.Close();
    			}
    		}
     
    	}
    ensuite j'ai ma form princale Menu qui se connecte via cette classe de connexion, et ça ça marche ! j'ai le message "connexion ouverte !" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    private void Form1_Load(object sender, System.EventArgs e)
    		{
     
    			//Connexion à la base à l'ouverture de l'application
    			DVD_JF.connexion.ConnexionBase();
     
     
    		}
    Voila. et enfin, dans une 3eme fenetre, je veux lancer une proc et remplir une liste. je fais comme ça et la ça plante avec le message suivant :

    Une exception non gérée du type 'System.InvalidOperationException' s'est produite dans system.data.dll
    Informations supplémentaires*: ExecuteReader*: la propriété Connection n'a pas été initialisée.

    et voici le code qui plante :

    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
    private void frmChoix_Load(object sender, System.EventArgs e)
    {
    //au lancement chargement de la liste des films à choisir
    
    	SqlCommand cmd = new SqlCommand();
    	cmd.Connection = connexion.co;
    
                 //requete de selection dans un datareader pour afficher les données.
    	cmd.CommandText = "ps_dvd_select_1";
    	cmd.CommandType = CommandType.StoredProcedure;
    			
    	SqlDataReader dr = cmd.ExecuteReader();	
    while (dr.Read())
    			{
    				lstFilms.Items.Add(dr["LIBELLE"].ToString());				
    			}
    
    			dr.Close();
    Voila ! ça plante sur la ligne en gras ! merci d'avance pour votre aide !!

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 82
    Par défaut
    Bonjour,

    je ferais plusieurs commentaires sur le code :
    • Dans "ConnexionBase" (ce qui au passage n'est pas un nom de méthode, mais je ne m'attarderais pas sur les conventions), tu ouvres certes ta base de données, mais en permanence tu la refermes dans ton finally. Par conséquent, tu n'auras jamais de connexion ouverte. N'oublie pas que ton finally est appelé tout le temps, que tu ais eu une exception ou non.
    • Ensuite, tu déclares un champs statique "co" dans ta classe, mais tu redéclares un variable locale "co" dans ta méthode. Tu n'initialises donc jamais ta connexion. Remplace donc "SqlConnection co = new SqlConnection();" par "co = new SqlConnection();"
    • Quand tu utilises ta connexion avec ton SqlDataReader, c'est dangereux. Fais bien attention que ton "Close" peux ne jamais avoir lieu en cas d'exceptions. Par conséquent, tu devrais utiliser la syntaxe using comme suit :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
       
      using (SqlDataReader dr = cmd.ExecuteReader())
      {
        while (dr.Read())
        {
          lstFilms.Items.Add(dr["LIBELLE"].ToString());				
        }
      }
      et donc supprimer ton "Close" qui sera fait automaituqment.

  3. #3
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 36
    Par défaut
    ok ça marche pas encore mais merci car c'est tout à fait le genre de conseils dont j'ai besoin.

    • Pour le finally c'est vrai je sais meme pas pourquoi j'ai fait ça. j'ai enlevé le close de la connexion et je vais déja plus loin !


    • pour l'initialisation de la connexion, je comprends bien également et j'ai corrigé mon erreur comme tu m'as dit...


    • Pour le using sur le datareader, je ne connaissais pas cette syntaxe... je donc remplacé la mienne par la tienne et c'est plus propre. Par contre ça ne marche toujours pas. le programme plante sur la ligne suivante :
      - using (SqlDataReader dr = cmd.ExecuteReader())
      avec ce message d'erreur :


    Une exception non gérée du type 'System.Data.SqlClient.SqlException' s'est produite dans system.data.dll
    Informations supplémentaires*: Erreur système.

    Mais ça ne vient pas du using car avec mon ancienne boucle, ça plante aussi de la meme façon... Qu'est ce que ça peut bien etre cette erreur ? Et n'est-ce pas plus simple ou recommandé d'utiliser un dataset pour remplir ma liste ?

    • Pour les conventions et le nom de ma méthode ConnexionBase, peux-tu me donner un exemple de nom que j'aurais pu donner ? merci !

  4. #4
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Pour la convention, une méthode est avant tout une action et il faut donc utiliser un verbe ou une phrase verbale pour nommer les méthodes. Je pense que c'est ce qu'avait Jarodtweiss en tête

  5. #5
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 36
    Par défaut
    d'accord, pas de probleme je vais l'appeler ConnecterBase() un truc comme ça !
    par contre ça marche toujours pas mon histoire !

  6. #6
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 36
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SqlCommand cmd = new SqlCommand();
    cmd = new SqlCommand("ps_select_dvd_1");
    cmd.Connection = connexion.co;
    cmd.CommandType = CommandType.StoredProcedure;	
     
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    DataSet ds = new DataSet();
    da.Fill(ds);
    bon je n'arrive pas à lancer ma proc !

    Avec une requete normale dans le code ça passe, mais avec ce code, ya erreur system lorsque je fais le da.fill(ds)... help please !!

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 82
    Par défaut
    Citation Envoyé par StormimOn Voir le message
    Pour la convention, une méthode est avant tout une action et il faut donc utiliser un verbe ou une phrase verbale pour nommer les méthodes. Je pense que c'est ce qu'avait Jarodtweiss en tête
    Oui effectivement :-) un verbe conjuguée pour représenter l'action "CrééConnexion", "ConnecteDB", .......

    Ici, ton code est bon, mais tu as une erreur SqlException, ce qui veut dire que ta procédure stockée n'est pas bonne. Si tu veux t'en assurer, remplace là par un "Select * from ..." et ton code devrait passer :-)

    C'est donc côté SQL que tu dois regarder. Tu peux poster une erreur plus précise et la requête si tu veux qu'on regarde

  8. #8
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 36
    Par défaut
    ok merci :
    voici l'erreur :

    Une exception non gérée du type 'System.Data.SqlClient.SqlException' s'est produite dans system.data.dll

    Informations supplémentaires*: Erreur système.

    et la procédure stockée est celle la :

    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
     
    CREATE PROCEDURE ps_select_dvd_1
    (	
    	@err 		int		output,
    	@lib_err 	varchar(255)	output
    )
    as
     
     
    SET NOCOUNT ON
     
    SELECT 	CODE, 
    	LIBELLE, 
    	DUREE, 
    	FLAGVU, 
    	FLAGDISPO, 
    	CHEMIN_JAQUETTE, 
    	ANNEE_SORTIE, 
    	REALISATEUR, 
    	SYNOPSYS, 
    	CODE_CATEGORIE, 
    	CODE_FORMAT
     
    FROM DVD
    ORDER BY LIBELLE;
     
     
    select @err=@@error
    if @err <> 0
    	begin
    		return
    	end
    return
    GO

    si je la remplace par un "select.... " dans le code, ça marche j'ai deja essayé, c'est l'utilisation de la procédure qui plante...
    Est-ce que les paramètres output faut les passer dans le code ou ya pas besoin ?

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

Discussions similaires

  1. Réponses: 17
    Dernier message: 14/07/2010, 14h12
  2. probleme de connexion à la base de donnees
    Par lucaazori1988 dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 21/12/2009, 18h02
  3. Probleme de connexion à la base Oracle
    Par guindb dans le forum Administration
    Réponses: 2
    Dernier message: 04/06/2007, 17h37
  4. [Conception] Connexion à une base de données
    Par delmimi dans le forum PHP & Base de données
    Réponses: 16
    Dernier message: 14/02/2007, 13h15
  5. probleme de connexion à une base sql avec mot de passe
    Par cari dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 16/12/2005, 10h16

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