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

Développement Web avec .NET Discussion :

Utilisation de SqlParameter


Sujet :

Développement Web avec .NET

  1. #1
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut Utilisation de SqlParameter
    Bonjour à tous.

    J'ai décidé (enfin) de passer à C# et je me trouve confronté à un souci que je ne comprends pas puisque la même chose en VB fonctionne.

    J'ai une erreur sur une SqlParameter qui serait déjà utilisé et je comprends pas pourquoi il me remonte cette erreur.
    Je vais vous présenter mon code :
    Dans ma page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    protected void Page_Load(object sender, EventArgs e)
        {
            SqlParameter[] LParam = new SqlParameter[1];
            LParam[0] = new SqlParameter("Urlsite", "Test");
            string testDB = DataAccess.RetounerScalaire("SELECT 1", LParam);
            System.Data.DataTable DT = DataAccess.RetournerTable("SELECT * FROM Heros", LParam);
            Outil.Logage(testDB);
            Outil.Logage(DT.Rows[0].ItemArray[1].ToString());
        }
    En gros je fais quoi ? Je monte un tableau de paramètre (même si là il n'y en a qu'un seul, c'est pas très grave, c'est un exercice). Ensuite j'appelle ma fonction pour me retourner soit un scalaire soit une datatable de la BDD. Pour l'exercice, j'ai utilisé le la même tableau de paramètre, histoire de faire simple, mais dans mes sites en VB.NET cela m'arrive d'utiliser le même tableau pour plusieurs requêtes et ça marche bien.

    Maintenant vous voulez voir ce qu'il se passe dans ma fonction (je vous donne toute la classe, comme ça, il n'y a pas de manque et vous verrez, c'est assez basique comme idée, mais ça rend bien service pour aller chercher les données dans la BDD) :
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    public class DataAccess
    {
        /// <summary>
        /// Constructeur de la classe DataAccess pour récupérer les données par l'envoi de trois paramètres
        /// </summary>
        /// <param name="Requete">La requête para lle même, en code SQL avec les alias des paramètres.</param>
        /// <param name="Pram">Le tableau de paramètres associé et préparé en amont dans le code.</param>
        /// <param name="TypeRQ">Une chaine donant une indication sur le type de résultat attendu. Pour l'instant c'est TB pour une table, SC pour un scalaire</param>
    	public DataAccess()
    	{
     
    	}
        public static DataTable RetournerTable(string Requete, SqlParameter[] Param)
        {
            return RemplirTable(Requete,Param);
        }
        public static string RetounerScalaire(string Requete, SqlParameter[] Param)
        {
            DataTable LaTable = RemplirTable(Requete, Param);
            string str = "";
            if (LaTable.Rows.Count == 0)
            {
                str = "";
            }
            else
            {
                str = LaTable.Rows[0].ItemArray[0].ToString();
            }
            return str;
        }
        /// <summary>
        /// Récupération du résultat de la requeête dans une DataTable qui sera analysée en retour dans le constructeur.
        /// </summary>
        /// <param name="Requete">La requête en dur sous forme de chaine avec les alias des paramètres</param>
        /// <param name="Param">Le tableau de paramètres monté en amont</param>
        /// <returns></returns>
        public static DataTable RemplirTable(string Requete, SqlParameter[] Param) 
        {
            //Récuparation de la chaine de connection dans le fichier de configuration (web.config)
            SqlConnection oConnex = new SqlConnection(ConfigurationManager.ConnectionStrings["DataDev"].ConnectionString);
            //Définition de la datatable de récupération des données
            DataTable Table = new DataTable();
            //Exécution de la requête et remplissage de la DataTable pour renvoi
            try
            {
                SqlCommand oCommand = new SqlCommand(Requete);
                SqlDataAdapter Adapteur = new SqlDataAdapter(oCommand);
                SqlCommandBuilder oCommandBuilder = new SqlCommandBuilder(Adapteur);
                oConnex.Open();
                oCommand.Connection = oConnex;
                oCommand.Parameters.AddRange(Param);
                Adapteur.Fill(Table);
            }
            catch (System.IO.IOException e)
            {
                Outil.Logage(e.Message);
                Outil.Logage(Requete);
                //throw;
            }
            finally
            {
                oConnex.Close();
            }
            return Table;
        }
    }
    Le plantage se fait sur la ligne " oCommand.Parameters.AddRange(Param);" avec le message d'erreur suivant :
    L'élément SqlParameter est déjà contenu dans un autre SqlParameterCollection.
    Je ne comprends pas pourquoi il me dit qu'il est déjà là alors que je fais appel à une autre requête en fait.
    Est ce que C# ne gère pas la mémoire comme VB.NET (certainement) ?
    Est ce que j'ai merdé sur ma classe avec le constructeur ?
    Et si oui, comment je corrige le truc ?

    Merci pour votre aide.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    le message d'erreur est assez explicite, le parametre est déjà un autre parametercollection, soit dans un autre objet command
    un objet parameter ne peut pas être dans 2 objets command, et en exécutant 2 requetes en utilisant le meme parameter, tu l'ajoutes dans 2 command différents
    tu peux tenter de le remove de sqlcommand.parameters après exécution, ou sinon il va falloir en instancier plusieurs

    sinon il y a très peu de différences entre vb.net et c# (aucune sur le framework en tout cas), donc il y a le même problème en vb.net

    et en parlant de gestion de la mémoire, il y a des classes qui implémentent IDisposable pour la libération de la mémoire non managée, (c'est le cas de connexion et de command par exemple), il faut donc idéalement appeler dispose en fin d'utilisation, ou mieux utiliser un bloc using(...) {...}
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Merci pour ta réponse.

    Je peux t'assurer que lorsque je ais la même chose en VB j'ai pas cette erreur.

    J'ai tenté un oCommand.Parameters.remove(Param) après le Fill de la table mais il est pas content et me dit :
    SqlParameterCollection accepte uniquement des objets de type SqlParameter non null, et non des objets SqlParameter[].
    Peut-être que je utilise pas la bonne méthode.

    Les bloc Using c'est encore très obscur pour moi. J'ai déjà pas trouvé d'équivalent au With de VB. Et j'avoue que la gestion de la mémoire, heu comment dire.....

    Pas simple ce langage en fait, faut vraiment tout lui dire.

    Merci encore pour ton aide.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    je t'assure que j'ai déjà eut le même message en vb.net après avoir tenté la même chose ^^

    remove devrait marcher, https://msdn.microsoft.com/en-us/lib...v=vs.110).aspx (sinon quel est le type d'erreur (pas le message))

    le bloc using c'est le même mot clé en c# qu'en vb.net

    le with du vb.net ne doit pas exister en c#, mais il ne sert pas à grand chose de toute façon ...

    et ce langage reste plus simple que d'autres, si tu oublies de faire Dispose ou d'utiliser using(...), dans la plupart des cas ca ne posera pas de problème, vu qu'il y a un garbage collector (videur de choses inutilisées de la mémoire) et des finaliseurs (pareil mais pour le non managé)
    là ou j'ai déjà vu des gens tomber sur le problème, c'est qu'ils généraient des images dans une boucle, et rapidement ca saturait la RAM
    donc en général les débutants peuvent en faire abstraction
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Merci pour ton retour.

    le With en VB est très utile pour... économiser mes petit doigts !! Et oui, je suis un codeur fainéant. C'est ce qui me rebute depuis longtemps sur le C# faut trop lui en dire par rapport au VB, je trouve. J'ai pas réussi à trouver la lecture des DataRow avec le nom du champ, faut lui passer l'index (si j'ai bien suivi) par exemple. Faut mettre des crochets ou des parenthèses partout, des accolades, enfin, plein de trucs auxquels je suis pas habitué avec VB. Mais bon, vu que je cherche du boulot et que personne ne recrute en VB, faut bien que je m'y colle. Et je prends un gros site que j'ai fait et je le recode intégralement en C# pour me faire un bon exercice.

    Pour revenir sur l'erreur, voici tout le message que le Visual Studio me donne :
    L'exception System.InvalidCastException n'a pas été gérée par le code utilisateur
    Message="SqlParameterCollection accepte uniquement des objets de type SqlParameter non null, et non des objets SqlParameter[]."
    Source="System.Data"
    StackTrace:
    à System.Data.SqlClient.SqlParameterCollection.ValidateType(Object value)
    à System.Data.SqlClient.SqlParameterCollection.Remove(Object value)
    à DataAccess.RemplirTable(String Requete, SqlParameter[] Param) dans d:\inetpub\HeroesC\App_Code\DataAccess.cs:ligne 87
    à DataAccess.RetounerScalaire(String Requete, SqlParameter[] Param) dans d:\inetpub\HeroesC\App_Code\DataAccess.cs:ligne 42
    à _Default.Page_Load(Object sender, EventArgs e) dans d:\inetpub\HeroesC\Default.aspx.cs:ligne 15
    à System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
    à System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
    à System.Web.UI.Control.OnLoad(EventArgs e)
    à System.Web.UI.Control.LoadRecursive()
    à System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
    InnerException:
    Une autre question qui n'a rien à voir : c'est quoi les Framework MVC ou WPF. Je vois souvent ça dans les annonces de boulot, mais j'arrive pas à trouver d'info dessus (si ça t'embête pas de répondre bien sûr).

    Bonne aprem à toi.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    je comprends bien ton point de vue, j'ai fait 10 ans de vb.net et je passe sur c# en ce moment
    il m'a fallu une ou deux semaines pour être habitué à la syntaxe
    et du coup je vois les différences qui me font préférer vb.net, c'est beaucoup plus lisible et il y a moins de choses à écrire (va trouver la fin d'une boucle quand il y a des accolades partout, alors qu'un next tu le repères tout de suite ^^)

    je confirme aussi qu'il y a moins d'emploi en vb.net, par contre sur mon cv j'ai marqué expert .net c#/vb.net
    parce que réellement tout ce que tu connais sur vb.net tu le retrouves sur c#, seule la syntaxe change et on s'y fait rapidement en intensif (surtout quand y a plus le choix d'ailleurs ^^)
    (enfin il y a bien quelques différences un peu plus grosses, mais rien de transcendant)
    là ou j'étais avant on avait embauché un développeur c# pour faire du vb.net, il s'est adapté tout de suite aussi ...

    après .net c'est large
    en .exe il y a appli console, service windows, winforms et wpf
    console c'est explicite et peu utilisé
    service windows, il n'y a pas d'interface non plus
    winforms c'est un framework graphique basé sur les controles de windows et la dll d'affichage GDI+ (qui date de 1998 il me semble)
    WPF c'est un framework graphique moderne sorti en 2008, et qui s'améliore à chaque nouvelle version
    c'est basé sur directX pour le rendu, et ca n'a rien à voir avec les winforms, l'interface ressemble plus à le l'html croisé avec de l'xml
    c'est déstabilisant au début, mais plutot plaisant au final (ca reste du code vb.net ou c# derrière, y a moins de code à produire, et graphiquement on peut se lacher)

    en web il y les webforms qui commencent à dater, et des tas de choses qui changent souvent comme MVC
    mvc est donc une méthodologie de développement ou tu as une classe Controller qui recoit la requete http (get/post, les paramètres ...)
    cette classe va intancier un Model (classe qui contient les données utiles), et la passer à la View qui s'occupe de générer le code html en fonction du model
    ca permet de bien structuer son code
    je ne m'étends pas plus parce que je ne suis pas expert, donc je n'ai pas une vue globale des technos web par microsoft, mais y a matière entre les web service, les web api, les différentes versions de mvc, les moteurs de cshtml/vbhtml comme razor ...

    et en plus de tout ca y a plein d'autres choses
    UWP, qui ressemble à wpf mais en légèrement différent, qui fait des .Appx pour windows 10/w10mobile, w10iot, xbox ...
    Xamarin, qui a encore un framework graphique différent je crois, et qui permet de compiler pour ios/android/w10m (et surement linux et macos aussi)
    apache cordova (multiplateforme html css js)
    etc... (y encore beaucoup de choses)

    et aussi des trucs qui n'existent plus comme silverlight ^^

    et des trucs qui évoluent pour essayer d'unifier tout ca (.net core, .net standard, asp.net vnext etc...) et qui changent de nom souvent
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Merci pour toutes tes explications.

    Je vos qu'il y a plein de trucs. Mais je me demande comment faire pour télécharger tous ces trucs là et travailler avec, histoires de voir à quoi ça ressemble.
    Par exemple : .NET C# MVC 5, je le trouve où le MVC 5 ?
    Autre exemple : Maîtrise de frameworks.Net : WPF, WCF, c'est quoi ces deux trucs WPF et WCF
    Ou encore : Angular JS, c'est un framework JScript comme JQuery ?

    Encore merci pour toute ton aide.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    si tu installes vs 2015 community et que tu fais nouveau projet, tu verras qu'il y a des tas de nouveaux projets, dont asp.net mvc 5, ou windows presentation foundation (= wpf) ...

    wpf j'ai expliqué ce que c'était

    en fait sous certains noms on parlent de framework de base (framework .net 4.5, .net core 1 ...)
    et sous d'autres noms on désigne des sous framework qui font partie d'une ou plusieurs versions de framework
    c'est le cas de WCF par exemple qui est un sous framework dispo sur plusieurs types de projets et de framework qui permet de gérer des échanges réseaux, et des web services

    après quand tu te poses une question (comme c'est quoi angularJS) tu demandes à google et tu lis un peu 2 ou 3 sites dont wikipedia ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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