none
Enregistrement d'une variable de type decimal dans une table SQL

    Question

  • Bonjour,

    Voilà encore une question de débutant (que je suis), mais j'ai cherché longtemps sur MSDN, et je n'ai pas trouvé.
    J'espère que quelqu'un aura la gentillesse de m'aider. Voilà le problème :

    J'ai défini dans une table SQL un champ MontantT de type decimal(8, 2);
    Dans mon programme, j'utilise une variable montantT définie comme suit :

        decimal montantT;

    L'utilisateur entre une valeur dans une textbox, que je récupère :

         montantT = decimal.Parse(montantTTextBox.Text);

    Tant que la valeur de la variable montantT est inférieure à 99,99 l'update fonctionne correctement :

            Caisse_MagasinDataSet.TransactionRow transactionRow;
            transactionRow = caisse_MagasinDataSet.Transaction.FindByRefT(refT);
            // Assign the new values to the desired column.
            transactionRow.DateT = dateT;
            transactionRow.RefA = refA;
            transactionRow.QteA = qteA;
            transactionRow.MontantT = montantT;

            this.transactionTableAdapter.Update(caisse_MagasinDataSet.Transaction);

    Mais au-delà , le programme me retourne l'erreur suivante :

     Une exception non gérée du type 'System.ArgumentException' s'est produite dans System.Data.dll
     Informations supplémentaires : Valeur du paramètre '100,00' hors limites. => cela  concerne évidemment la variable montantT

    Le problème est probablement dû à une définition incorrecte, mais où ?
    Un très grand merci d'avance.
    lundi 2 mai 2016 12:44

Réponses

  • Bonjour,

    Apriori vous utilisez un Dataset. Avez vous vérifiez comment était défini votre champ dans votre dataset ? Car j'ai l'impression qu'il est défini en numérique decimal(4,2) et pas decimal(8,2).

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    • Marqué comme réponse Mani035 vendredi 27 mai 2016 12:03
    vendredi 27 mai 2016 06:52

Toutes les réponses

  • Bonjour, Mani035,

    Veuillez consulter le thread en bas :
    Out of Range Error When Updating A Decimal Value
    Je vous remercie par avance de votre retour.

    Cordialement,
    Teodora


    Votez! Appel à la contribution TechNet Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mardi 3 mai 2016 09:06
    Modérateur
  • Teodora,

    Je vous remercie pour votre réponse, mais j'avais déjà consulté ce site et la page MSDN en référence, et cela ne m'a pas aidé.
    Je continue mes recherches. Si vous avez d'autres informations, je suis partie prenante !
    Je vous informe dès que j'ai la solution.

    PS

    j'ai modifié le programme pour éliminer le problème de variable :

       transactionRow.MontantT = decimal.Parse("200");

    Mais l'erreur est toujours là. Par contre, quand je modifie directement la valeur du champ dans la table avec M SQL Management Studio, je n'ai pas de problème...

    • Modifié Mani035 mardi 3 mai 2016 13:46
    mardi 3 mai 2016 13:29
  • Bonjour Mani035,

    J'espère pouvoir vous aider avec l'information en bas :
    How to store decimal values in SQL Server?

    Cordialement,
    Teodora


    Votez! Appel à la contribution TechNet Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    lundi 23 mai 2016 15:06
    Modérateur
  • Bonjour Teodora,

    J'ai été sur le lien que vous m'avez donné, mais il n'y a rien qui puisse m'aider, car je respecte les requis pour le type "decimal" déclaré dans ma table SQL.
    Dans ma table SQL, le champ MontantT est déclaré decimal(8,2), le champ PrixVente en decimal(8,2), le champ QteA en int

    Dans mon programme, j'effectue les calculs suivants :

    prixVente = decimal.Parse(drow[3].ToString());
    montantT = prixVente * qteA;

    Puis je mets la base SQL à jour :

    transactionTableAdapter.Insert(refT, dateT, typeT, refA, qteA, refS, montantT);

    Et c'est là que j'obtiens l'erreur {"Valeur du paramètre '120,00' hors limites."}, sachant que qteA vaut 5 et prixVente vaut 24,00.

    Logiquement, avec une déclaration decimal(8,2), je peux y stocker 999999,99 ce qui largement suffisant.
    Où est l'erreur ? Par défaut, dans un programme c#, est-ce que le type decimal accepte toutes les valeurs ?

    Merci de m'aider car je suis bloqué sur cette erreur depuis plusieurs semaines.

    mardi 24 mai 2016 15:00
  • Bonjour,

    J'ai enregistré une transaction d'un montant de 50,00 (MontantT = 50,00) à partir du programme.

    Dans la trace faite sur le serveur SQL, voici ce qu'il en résulte :

    exec sp_executesql N'INSERT INTO [Transaction] ([RefT], [DateT], [TypeT], [RefA], [QteA], [RefS], [MontantT]) VALUES (@RefT, @DateT, @TypeT, @RefA, @QteA, @RefS, @MontantT);
    SELECT RefT, DateT, TypeT, RefA, QteA, RefS, MontantT FROM [Transaction] WHERE (RefT = @RefT)',N'@RefT int,@DateT datetime,@TypeT nchar(6),@RefA nchar(2),@QteA int,@RefS char(8000),@MontantT decimal(4,2)',@RefT=148,@DateT='2016-05-24 00:00:00',@TypeT=N'SORTIE',@RefA=N'SO',@QteA=0,@RefS=NULL,@MontantT=-50.00

    L'erreur est visible : @MontantT decimal(4,2)
    Donc le maxi est 99,99. Il est évident que si MontantT est supérieur à 99,99, j'obtiens l'erreur :{"Valeur du paramètre '120,00' hors limites."}

    Il faut donc définir dans le programme c# la précision et l'échelle pour chaque variable de type decimal, puisque par défaut, on a decimal(4,2).

    Comment peut-on faire cela ?

    Merci pour votre aide.
    mardi 24 mai 2016 17:57
  • Bonjour,

    Apriori vous utilisez un Dataset. Avez vous vérifiez comment était défini votre champ dans votre dataset ? Car j'ai l'impression qu'il est défini en numérique decimal(4,2) et pas decimal(8,2).

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    • Marqué comme réponse Mani035 vendredi 27 mai 2016 12:03
    vendredi 27 mai 2016 06:52
  • Bien vu ! Le problème était effectivement dans le Dataset.

    Dans le fichier masolutionDataSet.xsd, j'ai trouvé (entre autres) ces 2 lignes :

    <Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Decimal" Direction="Input" ParameterName="@Original_PrixAchat" Precision="4" ProviderType="Decimal" Scale="2" Size="0" SourceColumn="PrixAchat" SourceColumnNullMapping="false" SourceVersion="Original" />

    <Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Decimal" Direction="Input" ParameterName="@MontantT" Precision="4" ProviderType="Decimal" Scale="2" Size="0" SourceColumn="MontantT" SourceColumnNullMapping="false" SourceVersion="Current" />

    J'ai cherché un moyen "propre" pour modifier ces valeurs (dans le diagramme masolution.edmx, menu contextuel, Mettre à jour le modèle à partir de la base de données...), mais ça n'a pas donné de résulat.
    En fin de compte, j'ai modifié manuellement la Precision dans le fichier .xsd, et cela a fonctionné.

    Donc, un TRES TRES grand merci.

    Mais j'ai encore un question : pourquoi ce fichier ne se met pas à jour quand je clique sur "Configurer le DataSet à partir de l'assistant" dans "Sources de données" ? Ce n'est pas logique.
    Si je modifie le type de données avec SQL S M S (float au lieu de decimal), puis que je fais la mise à jour comme décrit ci-dessus, la modification est bien prise en compte. Pourquoi pas Precision et Scale ?
    La définition initiale de ces champs était effectivement en decimal( 4, 2), mais la modification n'a pas été répercutée.
    vendredi 27 mai 2016 12:03
  • Je vois qu'il s'agissait plus des paramètres de vos DataAdapters qu'une colonne de votre DataTable.

    Normalement vous y avez accès en sélectionnant votre DataAdapter, dans les propriétés vous avez les requêtes INSERT et UPDATE qui contiennent des paramètres et c'est là que vous devez retrouver votre fameuse précision.

    Je ne sais pas pourquoi les DataSet ne réactualisent pas les précisions des nombres, mais ils ont toujours eu la réputation d'avoir des points capricieux plutôt agaçants. Certainement une des raisons pour laquelle ils ont été abandonnés au profit de Entity Framework.

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    vendredi 27 mai 2016 12:30