web-dev-qa-db-fra.com

Valeurs non insérées dans la base de données SQL Server

J'ai un cas vraiment intéressant: lors de mon processus d'achat, j'ai une vue partielle sur deux vues pour afficher le prix total de la commande et les prix de livraison. 

Cette vue partielle est rendue par l'action ShowCartDiscountsPrices. À la fin, je dois insérer Entity Framework dans la base de données MinDeliveryPrice, MinDeliveryPriceDDS, DeliveryPrice, DeliveryPriceDDS

Le problème étrange est que dans deux cas la semaine dernière dans ma base de données SQL Server, je n’ai de la valeur que pour DeliveryPrice ET PARFOIS, LES AUTRES TROIS COLONNES SONT NULES dans ma base de données SQL Server. 

Et quand je regarde le problème et fais une commande avec les mêmes articles, par exemple une heure après, tout va bien et les quatre colonnes sont remplies et pendant cette période, personne n’a apporté de modification à la base de données. 

Je me demande quel est le problème, puis-je écrire un script de journalisation pour voir si des erreurs se produisent dans SQL Server ou IIS peut-être?

public ActionResult ShowCartDiscountsPrices(OrderDiscountPriceModel model, bool? ischange, int? deliverypreference)
{
    var cart = ShoppingCart.GetCart(WebsiteContext.CurrentUser != null ? (int?)WebsiteContext.CurrentUser.UserID : null);  

    decimal mindeliveryprice = 0;
    decimal mindeliverypricedds = 0;

    if (deliverypreference != null || Session["DeliveryPreference"] != null)
    {
        var parsedelprice = deliverypreference.HasValue ? deliverypreference.Value == 1 ? Decimal.TryParse(Settings.GetSettingByName("Eshop_SpeedyMinDeliveryPrice"), out mindeliveryprice) :Decimal.TryParse(Settings.GetSettingByName("Eshop_HomeMinDeliveryPrice"), out mindeliveryprice) : Decimal.TryParse(Session["MinDeliveryPrice"].ToString(), out mindeliveryprice );

        var parsedelpricedds = deliverypreference.HasValue ? deliverypreference.Value == 1 ? Decimal.TryParse(Settings.GetSettingByName("Eshop_SpeedyMinDeliveryPriceDDS"), out mindeliverypricedds) : Decimal.TryParse(Settings.GetSettingByName("Eshop_HomeMinDeliveryPriceDDS"), out mindeliverypricedds) : Decimal.TryParse(Session["MinDeliveryPriceDDS"].ToString(), out mindeliverypricedds );

        decimal deliveryprice;
        decimal deliverypricedds;

        ShoppingCartHelper.CalculateArticlesDeliveryPrice(mindeliveryprice, mindeliverypricedds, cart.ComputeTotalTransport(), cart.ComputeTotalTransportDDS(), out deliveryprice, out deliverypricedds);

        model.DeliveryPrice = deliveryprice;
        model.DeliveryPriceDDS = deliverypricedds;
        model.DeliveryPreference = deliverypreference.HasValue ? deliverypreference.Value : (int)Session["DeliveryPreference"];
        model.MinDeliveryPrice = mindeliveryprice;
        model.MinDeliveryPriceDDS = mindeliverypricedds;
        model.FinalSum += deliverypricedds;
    }
    else
    {
        if (isFromLastStep != null && bool.Parse(isFromLastStep.ToString()) == true)
            ViewBag.IncludeDelivery = true;
    }            

    if (deliverypreference != null)
    {
            Session["DeliveryPreference"] = deliverypreference;
            Session["MinDeliveryPrice"] = mindeliveryprice;
            Session["MinDeliveryPriceDDS"] = mindeliverypricedds;
    }

    ViewData.TemplateInfo.HtmlFieldPrefix = "OrderDiscoutPrice";
    return PartialView("_CartDiscountsPrices", model);
}

Et voici les fonctions d'assistance qui parcourent uniquement une collection d'articles et calculent les prix de livraison totaux.

 public decimal ComputeTotalTransport()
        {
            decimal totalarticletransport = 0;                
            decimal articletransport;
            foreach (var article in lineCollection)
            {
                if (decimal.TryParse(article.Article.Transport.ToString(), out articletransport))
                {
                    totalarticletransport += article.Article.Quantity * articletransport;
                    articletransport = 0;
                }
            }
            return totalarticletransport;
        }
public decimal ComputeTotalTransportDDS()
        {
            decimal totaltransportdds = 0;           
            decimal articletransportdds;
            foreach (var article in lineCollection)
            {
                if (decimal.TryParse(article.Article.TransportDDS.ToString(), out articletransportdds))
                {
                    totaltransportdds += article.Article.Quantity * articletransportdds;
                    articletransportdds = 0;
                }
            }
            return totaltransportdds;
        }
7
Tania Marinova

Bonjour, je promets d’ajouter du code à ma réponse, mais en réalité, le problème était le redémarrage du serveur IIS. 

1
Tania Marinova

Je souhaite vous suggérer d’étendre votre expression if un peu plus loin, comme indiqué ci-dessous, pour vérifier si la valeur de la session est supérieure à 0, comme indiqué ci-dessous.

if (Convert.ToString(deliverypreference) != "" && Convert.ToString(Session["DeliveryPreference"]) != "" && Convert.ToDecimal(deliverypreference) > 0 && Convert.ToDecimal(Session["DeliveryPreference"]) > 0)
    { 
       //Your insert logic as you have written.
    }

Comme vous le savez peut-être, votre variable de session risque de ne pas être vide ou de chaîne vide, mais la valeur de session est égale à 0. Dans ce cas, votre code sera exécuté mais les données ne seront pas insérées correctement.

La deuxième solution de contournement est de vous suggérer de désactiver la valeur null autorisée dans la colonne Sql Server en modifiant le tableau en mode Création.

J'espère que ceci vous aidera.

6
Suraj Kumar