Passage de parametre à une fonction C#

Signaler
Messages postés
69
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
15 mars 2011
-
Messages postés
69
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
15 mars 2011
-
Bonjour,

Je travail actuellement sur un système de réservation en C# et pour se faire j'ai pour but de récupérer l'identifiant de la session windows pour ensuite m'en servir dans une requête SQL pour récuperer les lignes où le champ login de la table soit égale à cet identifiant. Je suis stagiaire dans une entreprise et le problème est que l'on m'a dit de faire de telle manière, en créant un paramètre (DbParameter) mais je ne comprend vraiment pas le principe...Je cherche depuis 2 jours sur internet mais sans aucune progression. Et là personne qui a "commencé" celà comme ça n'est jamais là donc je dois me débrouiller absolument mais la je désespère a obtenir le résultat que je désire. Je vais donc essayer de vous faire voir un peu mon code et ce que je veux y faire, en éspèrant réussir à me faire comprendre pour avoir un peu d'aide.

J'ai une classe Defautl.apx.cs où se trouve ce code (récuperation du login de session windows) :

public string login;

        protected void Page_Load(object sender, EventArgs e)
        {
            //Authentification();
            WindowsIdentity id = WindowsIdentity.GetCurrent();
            login = id.Name.Substring(5, id.Name.Length - 5);


J'ai une méthode GetAnnuaire qui se trouve dans une classe DaAnnuaire.cs, comme ceci :

public Annuaire GetAnnuaire(string login)
        {
            using (DbConnection _connection = _providerFactory.CreateConnection())
            {
                _connection.ConnectionString = _connectionString;
                _connection.Open();
                DbCommand _command = _providerFactory.CreateCommand();
                _command.Connection = _connection;
                _command.CommandText "SELECT * FROM annuaire_new WHERE login @login";

                DbParameter param0 = _providerFactory.CreateParameter();
                param0.ParameterName = "@login";
                param0.DbType = DbType.String;
                param0.Value = login;
                _command.Parameters.Add(param0);

                DbDataReader reader = _command.ExecuteReader();
                DataSet ds = new DataSet();
                ds.Load(reader, LoadOption.OverwriteChanges, "Annuaire");

                if (ds.Tables[0].Rows.Count > 0)
                {
                    DataRow row = ds.Tables[0].Rows[0];
                    Annuaire a = new Annuaire();
                    a.Numero = row["numero"].ToString();
                    a.Nom = row["nom"].ToString();
                    a.Prenom = row["prenom"].ToString();
                    a.Telephone = row["telephone"].ToString();
                    a.Poste = row["poste"].ToString();
                    a.Numdirection = row["numdirection"].ToString();
                    a.Numservice = row["numservice"].ToString();
                    a.Unite = row["unite"].ToString();
                    a.Emploi = row["emploi"].ToString();
                    a.Matricule = row["matricule"].ToString();
                    a.Annuaire_tri = row["annuaire_tri"].ToString();
                    a.Mail = row["mail"].ToString();
                    a.Sexe = row["sexe"].ToString();
                    a.Annuaire_newsletter = row["annuaire_newsletter"].ToString();
                    a.Mail_pass = row["mail_pass"].ToString();
                    a.Mobile2 = row["mobile2"].ToString();
                    a.Portable_telephone = row["portable_telephone"].ToString();
                    a.Annuaire_datemisajour = row["annuaire_datemisajour"].ToString();
                    a.Dg_matricule = row["dg_matricule"].ToString();
                    a.Login = row["login"].ToString();


                    return a;
                }

                return null;
            }
        }


J'ai ma classe ProAnnuaire.cs comme ceci :

namespace ProcessReservation
{
    public class ProAnnuaire
    {
        public List GetAllAnnuaire()
        {
            DaAnnuaire da = new DaAnnuaire();
            return da.GetAllAnnuaire();
        }

        public Annuaire GetAnnuaire(string login)
        {
            DaAnnuaire da = new DaAnnuaire();
            return da.GetAnnuaire(login);
        }
    }
}


Et dans ma page Default.aspx j'affiche mon ObjectDataSource comme ceci :


        


Et si j'exécute le projet tel qu'il est actuellement j'obtiens l'erreur suivante : ObjectDataSource 'ObjectDataSource1' could not find a non-generic method 'GetAnnuaire' that has no parameters.


Je ne sais pas si je suis clair dans mon explication, je souhaite tout simplement récupérer le login windows (1ere classe) et ensuite allez m'en servir dans ma requête SQL de la méthode GetAnnuaire e la classe DaAnnuaire.

J'ai vraiment du mal avec ce type de fonctionnement (process, DA, BO) mais je dois faire comme ceci.

Pouvez-vous m'aider et même m'éclairer un peu plus sur ce fonctionnement, qui doit être courant en C# apparemment.

Bien à vous,

SaiYan.

15 réponses

Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
43
Salut

Ton problème vient du fait que GetAnnuaire prend un paramètre (string login) que tu ne fournis pas dans ton ObjectDataSource1. Rajoute un <selectparameters> pour fournir le paramètre login.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé ! -
Messages postés
69
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
15 mars 2011
1
Tu es toujours très rapide à répondre krimog ^^
J'ai donc mis

            <SelectParameters>
                
            </SelectParameters>
        


J'obtiens désormais l'ereur suivante : The parameterized query '(@login nvarchar(4000))SELECT * FROM annuaire_new WHERE login = ' expects the parameter '@login', which was not supplied.

Mais comment ça le paramètre n'est pas fourni ? Je m'y prend mal ? (selon le code de ma class DaAnnuaire que j'ai posté).
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
43
J'avoue ne pas parfaitement connaître la syntaxe des paramètres, mais dans ton exemple, tu n'as pas donné de valeur à ton paramètre (tu as juste donné le nom et le type)

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé ! -
Messages postés
69
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
15 mars 2011
1
La valeur pour le paramètre n'est pas assignée ici ?
DbParameter param0 = _providerFactory.CreateParameter();
                param0.ParameterName = "@login";
                param0.DbType = DbType.String;
                param0.Value = login;                  <============= ICI
                _command.Parameters.Add(param0);


Tout cela est bien flou pour moi :/. D'aspect ça parait pourtant simple, récupérer un login, le stocker dans une variable puis le passer en paramètre de fonction... piouuu.
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
43
C'est pas la valeur de param0 dont je parle mais la valeur de login en l'occurrence.

En gros

DataObjectSource <=1=> ProAnnuaire.GetAnnuaire(login) <=2=> DaAnnuaire.GetAnnuaire(login) <=3=> Base de données

La liaison <=1=> indique la méthode à appeler via SelectMethod et TypeName, mais n'indique pas la valeur de "login" et c'est ça ton erreur.

La liaison <=2=> c'est du code simple et ça transmet son paramètre login à l'autre méthode.

La liaison <=3=> c'est du SQL et ça transmet la valeur du login là où tu l'as indiqué dans ton dernier post.

Mais le problème est bel et bien au niveau de la liaison 1 : il faut pouvoir indiquer à ProAnnuaire.GetAnnuaire(string login) quelle valeur tu choisis pour login.

Comme je te le disais, je n'ai pas des tonnes de connaissances en ce qui concerne les ObjectDataSource, donc je ne peux pas te dire la syntaxe exacte, mais google le peut certainement ;)

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé ! -
Messages postés
69
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
15 mars 2011
1
Ok donc si je comprend bien il faut que je cherche comment passer la valeur à la méthode ProAnnuaire.GetAnnuaire(string login) via le code de la page aspx, c'est bien ca ?
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
43
C'est bien ça (en tout cas c'est ce qui me paraît être le problème)

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé ! -
Messages postés
69
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
15 mars 2011
1
Un attribut DefaultValue existe pour asp:Parameter et si je lui passe login ou "login" il y a plus d'erreur, mais aucune n'est ligne retournée.
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
43
C'est pas login ou "login" qu'il faut que tu lui passes, c'est une valeur !!

Ta requête, au final, c'est
SELECT * FROM annuaire_new WHERE login = @login;

Mais il faut bien que tu précises la valeur de @login à un moment où à un autre. Dans tout ton programme, tu te trimbales une variable de méthode en méthode, mais tu ne passe pas de valeur à ta 1ère méthode !!

Avec tes modifs, DataSourceObject1 dit que login = "login", puis il transmet cette valeur à ProAnnuaire qui la transmet à DaAnnuaire donc ta requête sera la suivante :

SELECT * FROM annuaire_new WHERE login = 'login';


Si tu souhaites que ta requête soit

SELECT * FROM annuaire_new WHERE login = 'toto'; 


il faut mettre "toto" en DefaultValue de ton AspParameter

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé ! -
Messages postés
69
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
15 mars 2011
1
Ok, si j'écris en dur un login du genre DefaultValue="toto" ca me retourne bien la ligne de la table qui a toto comme login mais moi je voudrai que ca s'adapte selon l'utilisateur connecté, donc pas lui passé une chaine de caractère mais bien une variable, et ici en l'occurrence ma variable login qui a récupéré le login de session windows.
Je ne dois plus être si loin :/
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
43
Tu peux essayer, dans le code behind, de faire un truc du style :

void page_load(...)
{
    ObjectDataSource1.SelectParameters.Add(new Parameter("login", Session["login"].ToString()));
}

Attention, je ne garantis absolument pas que mon code fonctionne, mais c'est pour te donner une idée.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé ! -
Messages postés
69
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
15 mars 2011
1
En cherchant un peu sur google j'ai trouvé quelque chose du genre

ObjectDataSource1.SelectParameters.Add("login", login);


Donc il passerait la valeur de la variable login au parametre nommé login de l'obet ObjectDataSource1. Du moins moi je vois ca comme cela.

J'ai maintenant cette erreur : ObjectDataSource 'ObjectDataSource1' could not find a non-generic method 'GetAnnuaire' that has parameters: login, login1.

Qu'est-ce que ce login1 ? tu as une idée ?
Messages postés
69
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
15 mars 2011
1
Je viens de comprendre. On peut ajouter le paramètre directement dans le code behind au lieu du code aspx.
Donc je peux écrire par exemple :

ObjectDataSource1.SelectParameters.Add("login", ProcessReservation.ProAnnuaire, login);


et retirer de ma page aspx ce code

<SelectParameters>
                
            </SelectParameters>


Exact ? Si oui je vois un peu mieu le fonctionnement même si le code n'a pas encore l'air correct...
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
43
Oui, si tu ajoutes le paramètre dans ton .cs, il ne faut pas l'ajouter dans ton .aspx

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé ! -
Messages postés
69
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
15 mars 2011
1
Haa ba ca y est ca fonctionne.

Juste en mettant :

ObjectDataSource1.SelectParameters.Add("login", login);


ca fonctionne.

Et là je suis blazé...une collègue vient de me montrer que en deux cliques avec l'assistant mon problème été résolu...

A trop être habitué à tout coder de A à Z j'ai du mal à me faire aux assistants qui désormais font tout le travail à votre place dans les environnements de développement, alala.

En tout cas merci à toi krimog, à bientôt :) (pas trop tôt je vais essayer).