Probleme de chaine de connexion sql avec divers modules

cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 - 29 juin 2009 à 14:12
cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 - 29 juin 2009 à 17:35
bonjour,
j'ai mis ma question sous ce theme mais je ne sui s pas sur que ce soit le bon car cela comprend aussi qques notions plus generales sur c# et la programmation en générale...
je developpe un programme qui va utiliser  des dlls que j'ai faites...
ce programme est orienté base de données
disons que j'ai créé une solution nommée utilisateur ou je met toutes mes données et traitement concernant une société de mon programme (ce programme société peut etre utilisé par plusieurs programmes travaillant ds des bases de données de nom differents mais de meme struture ( ex : un programme de compta traitant plusieurs société sur un meme ordi avec des noms de base de données differentes et des utilisateurs differents avec des droits differents sur les differentes sociétés) .
Disosn qu'il y a 3 programmes compta1, compta2 et compta3 avec ces 3 bases de données
J'ai meme une solution base de données BD qui contient les chaines de connexion que je réutilise a travers mon programme " final".
Dans ma classe société , j'ai des champs statiques : nom de société etc...
j'ai une classe variable ou je declare un objet statique societe
dans le constructeur de la classe société , je veux charger les infos contenues ds la BD sur la societe
mais au niveau de la commande cmd.executenonquery() j'ai la propriété d ela connexion qui n'est pas "établie" ,

ds mon programme main , j'ai
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            //Application.Run(new Form1());

            Class_var.set_serveur(".");
            Class_var.set_catalog("mon_catalog");
            Class_var.set_type("sql");
            Form fo =new Form1();

            if (!fo.IsDisposed)
            {
                Application.Run(fo);
            }

les fonctions set... sont censées attribuer les propriétés de la chaine de connexion mais apparemment ( j'ai placé un message box ds mon constructeur de societe qui me dit a ce moment que catalog n'est pas rempli encore ...)

Je ne sais pas si c'est tres clair ...

En fait je cherche a ce que mes elemen,ts de connexion a la base d edonnées soit "rempli" en premier lieu avant tout autre variable statique ...

est ce possible ??

Merci

4 réponses

krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
29 juin 2009 à 14:49
Salut

Je ne suis pas sûr d'avoir bien compris : tu as plusieurs membres statiques qui, pour leur initialisation, nécessitent que certains autres membres statiques soient initialisés ?

Alors déjà, un membre statique s'initialise dès le lancement du programme, de haut en bas.

static int a = b;
static int b = 10;
// a = 0 dans l'exemple

static int b = 10;
static int a = b;
// a = 10 dans l'exemple

Cependant, si tu veux mieux contrôler leur initialisation, tu peux faire un constructeur statique (puisque ce constructeur est appelé automatiquement par le programme, il n'a pas d'opérateur de portée (public...)) dans lequel tu initialise comme tu veux et dans l'ordre que tu veux tes membres. Encore mieux, tu peux utiliser un Design Pattern : le singleton. Il te permettra de faire un objet normal mais que tu appelleras via une propriété statique.
0
cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 2
29 juin 2009 à 15:21
merci de votre reponse rapide mais je n'ai aps tout compris non plus :-(
alors j'essaie d'expliciter un peu mieux
en fait , voila ce que j'ai :
une classe BD
dont le constructeur prend en parametre catalog
dans un premier projet

une classe societe qui contient nom_societe (et dont le constructeur charge le champ de la bd coresspondant au champ nom dans la variable statique)
        public Class_societe()
        {
            charger_infos_soc();
        }

        public static void charger_infos_soc()
        {
            Class_bd bd = new Class_bd(Class_var.get_bd_type(), Class_var.get_catalog(), Class_var.get_serveur());
            try
            {
                MessageBox.Show(Class_var.get_catalog());
                bd.cmd.CommandText = "select "
                + " soc_id,soc_nom_courant"
                + " from societe";
                bd.dataAdapter.SelectCommand = bd.cmd;
                DataTable dt = new DataTable();
                bd.dataAdapter.Fill(dt);
                if (dt.Rows.Count ==1)
                {
                  _id =Convert.ToInt32(dt.Rows[0]["soc_id"]);
                  _nom_courant = dt.Rows[0]["soc_nom_courant"].ToString();
                }
                else
                {
                    if (dt.Rows.Count > 1)
                    {
                        MessageBox.Show("Plusieurs sociétés définies !");
                    }
                    else
                    {
                        MessageBox.Show("Aucune société définie!");
                    }
                }

               
            }
            catch (Exception ex)
            {
                Class_erreur.erreur(ex.ToString());
            }
        }

une class_var qui contient une fonction statique set_catalog(string catalog)
        public static void set_catalog(string catalog)
        {
            _catalog = catalog;
        }
et get_catalog qui va retourner la chaine de connexion (enfin la partie _catalog)
et la variable statique
public static Class_societe soc = new Class_societe();

dans un 2e projet ( qui depend du 1er projet )

dans le main du 3e projet , je fais ce qui est ecrit plus haut
je le lance
Mais le 1er message que je recois c'est une erreur venant de class_societe
(donc pour l'objet créé ds class_var de mon 2e projet je presume)

donc ds le message box de charger_infos_soc , je n'ai rien (la chaine est vide) ...

Peut etre que c un defaut de conception de ma part... puis je le
contourner , comment ? puis je avoir un exple de csteur statique ou de
singleton


merci
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
29 juin 2009 à 16:13
Donc tu dis que la ligne : MessageBox.Show(Class_var.get_catalog()); affiche une messagebox vide.

Donc Class_var.get_catalog() renvoie "" ou null.
Et je suppose que ta méthode get_catalog() ressemble à ça : return _catalog;

Voici donc ma question : quand appelles-tu la méthode set_catalog() ?
Car si tu ne l'appelles pas avant d'utiliser la méthode get_catalog(), c'est normal d'avoir des problèmes...

PS : en ce qui concerne les constructeurs statiques et le singleton en C#, Google est là pour ça.
PPS : en C#, pour des accesseurs à des membres, on n'utilise pas de méthodes mais des propriétés, c'est beaucoup plus simple :
public static string Catalog
{
get { return _catalog; }
set { _catalog = value; }
}
0
cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 2
29 juin 2009 à 17:35
merci

le set_catalog est ds le main ( cf 1er message) mais apparemment il est "utilisé" apres que les variables statiques soient créées et/ou initialisées

j'utilise set_catalog car c'est en fait une fonction qui va donner le nom du catalog aux autres variables des projets ( ex: ici le 3e projet va contenir l'info du catalog , il va le transmettre au 2e ....)
comme ca je peux créer un 4e projet qui peut egalemnt utiliser le 2e mais avec un autre catalog ... c'est pas la bonne methode ???
J'ignore encore pas mal de chose sur les projets en c# notamment au niveau de la réutilisation de projets pour d'autres programmes...

voila en fait je cherche a pouvoir réutuiliser mon projet 2 sans avoir a tout reparametrer a chaque fois... (mais en ayant toujour sla meme strucutre ... )
0
Rejoignez-nous