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#

  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 ?

  9. #9
    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
    ça m'a lair relativement correct pourtant.
    Tu peux essayer en supprimant tes paramètres de sortie et tout ce quil y a après ton order by pour tester

  10. #10
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 36
    Par défaut
    ça passe !!!

    sans les paramètres de sortie et la gestion des erreurs, ça passe !

    Faut-il passer les paramètres output dans le code C# ? c'est peut-etre ça qui marche pas, j'ai deux paramètres que je déclare pas dans le code... mais je ne sais plus comment on fait... bon c'est deja mieux !
    merci !

  11. #11
    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
    Tu devrais avoir normalement une erreur SQL plus détaillée. Tu peux essayer d'appeler ta SP en SQL "pur" (sans la couche .NET) pour voir si Sql Serveur accepte (par exemple, un de tes paramètres n'est pas "setté" en Sql).

    Sinon je ne me souviens plus effectivement si tu as besoin de lire tes paramètres côté .NET. Je ne pense pas, mais je ne suis pas certain.

  12. #12
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 36
    Par défaut
    Citation Envoyé par Jarodtweiss Voir le message
    Tu devrais avoir normalement une erreur SQL plus détaillée. Tu peux essayer d'appeler ta SP en SQL "pur" (sans la couche .NET) pour voir si Sql Serveur accepte (par exemple, un de tes paramètres n'est pas "setté" en Sql).
    Euh la j'ai pas trop compris ce que tu veux que je tente... pour le sql "pur"...

  13. #13
    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
    juste de faire un EXEC sp... dans SQL pour voir si lui comprend ton ancienne SP

  14. #14
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 36
    Par défaut
    oui oui ça ça marche. c'est pas grave pour l'instant j'ai enlevé ma gestion d'erreur et ça marche je peux avancer ! merci !

  15. #15
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    plus efficace que des variables de type output qui ont tendance à disparaitre au fil du temps...

    retourner un resultset. turetourne soit une ligne avec deux colonnes, soit deux lignes avec une colonnes si les deux ont le meme type c'est toi qui voit... ca n'a pas d'importance.

    les variables en output pose probleme... de gros problemes... j'avais des erreurs aussi a l'époque quand je les utiisais... parfois erreur parfois non... j'ai décidé d'uniformiser tout ca et d'utiliser des resultset de sortie... plus efficace finallement, d'autant que le code décrit dans ce post

    adapter.fill(ds) tepermet de récupérer le resultset de sortie déjà... autant en profiter.

  16. #16
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 36
    Par défaut
    Un resultset ?? c'est quoi encore cet animal ? bah si tu me dis que c'est mieux, je vais m'y pencher alors pour voir comment je peux l'utiliser !

    merci !

    Edit : Bon je trouve pas grand chose la dessus... ya moyen d'avoir un lien vers un article qui en parle ou une petite explication sur comment utiliser un resultset dans ma proc ?

    merci d'avance...

  17. #17
    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
    Ce qu'il veut dire par là, c'est "juste" avec une procédure qui retourne deux données : soit typiquement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select * from table1
    select * from table2
    Ceci dit, je ne pense pas que je recommenderais ça. Je considère les erreurs comme des exceptions ne devant pas être traités comme des cas normaux. En plus si je ne m'abuse avoir une SP qui retourne deux resultsets va t'obliger à l'appeler côté .NET via DataAdapter et non avec un DataReader

  18. #18
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    il utilise deja un DataAdapter... ca ne changera rien.

    Ensuite, c'est vrai qu'il devrait plutot envisager d'indiquer au code C# que la proc stock a renconté une erreur, grâce à la fonction T-SQL RAISERROR avec un niveau de sévérité suffisant pour que le framework conduise à une exception lors du adapter.fill(ds);
    il suffit de récupérer les derniers messages SQL et c'est bon tu as l'erreur SQL engendrée dans ton RAISERROR.

    Si en revanche le resultat est correct, sortir le resultat par un select valeur et le recupérer dans ton DataSet en sortie.
    Moi quand je sais très bien que je n'attend pas divers RecordSets je fait un adapter.fill(dt) avec dt un DataTable au lieu d'un DataSet mais bon.

  19. #19
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 36
    Par défaut
    merci j'essaiera le raiseError !

    bon j'ai de nouveau le problème et la j'en ai vraiment besoin !! imposible de passer une procédure paramètrée, meme avec un seul paramètre en entrée ! pourtant j'ai l'impression que tout est bon ! (il doit bien y avoir une erreur, peut etre une question de config sql server ?)
    pour info, j'utilise VS 2003 et Sql Server 2000 !

    Voici mon code d'appel de la proc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SqlCommand cmd = new SqlCommand("ps_select_dvd_2",connexion.co);
    cmd.CommandType = CommandType.StoredProcedure;	
     
    cmd.Parameters.Add("@CODE", SqlDbType.Int, 3).Value = lignevalue;
     
     
    SqlDataAdapter daInfo = new SqlDataAdapter(cmd);
     
    DataSet dsInfos = new DataSet();
    daInfo.Fill(dsInfos);
     
    lblLibelle.Text = dsInfos.Tables[0].Rows[0]["LIBELLE"].ToString();
    et ma procédure stockée toute simple :

    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
     
    CREATE PROCEDURE ps_select_dvd_2
    (	
    	@code_dvd	int
    )
    as
    /*slection d'un dvd à partir de son code */
     
    SET NOCOUNT ON
     
    SELECT d.CODE, 
    	d.LIBELLE, 
    	d.DUREE, 
    	d.FLAGVU, 
    	d.FLAGDISPO, 
    	d.CHEMIN_JAQUETTE, 
    	d.ANNEE_SORTIE, 
    	d.REALISATEUR, 
    	d.SYNOPSYS, 
    	f.libelle,
    	c.libelle
     
     
    FROM 	DVD d,
    	[FORMAT] f,
    	CATEGORIE c
    WHERE d.CODE = @code_dvd
    AND c.code = d.code
    AND f.code=d.code
     
     
    GO
    il plante avec le meme message :

    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.
    Y-A-t-il un autre moyen que celui que j'utilise pour lancer ma proc ?
    merci de votre aide !

  20. #20
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 36
    Par défaut
    personne a une idée, meme toute petite ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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