Nákupní košík C#   otázka

ASP.NET/IIS, Databáze

Dobrý den,

na internetu jsem nalezl tento tutoriál na jednoduchý nákupní košík:

http://net.tutsplus.com/tutorials/other/...

V článku mají ve třídě Product.cs jen zapsané produkty staticky. Rád bych, aby se produkty načítali z databáze dynamicky.

Chtěl bych Vás poprosit o správné nasměrování, jak vyřešit tento problém. Předem Vám moc děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Asi bych použil LINQ to SQL a dynamicky vytvářel dotaz do DB dle vybraného produktu.Řešení Vám tu nikdo psát nebude,ale s tím asi počítáte ;)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji za reakci, s LINQ to SQL nemám zatím žádné zkušenosti, pokouším se to udělat přes ADO.NET ve třídě Product.cs se snažím připojit k databázi a přes Id produktu vytáhnout cenu:

 
public class Product
{
    public int Id { get; set; }
    public decimal Price { 
        get{
        string connStr = System.Configuration.ConfigurationSettings.AppSettings["mujconnectstring"];
        string sqlCommand = "SELECT [Cena] FROM [Produkty] WHERE [IdProdukt]=@IdProdukt";
        //vytvořit připojení k databázi 
        SqlConnection con = new SqlConnection(connStr);

        //vytvořit příkaz 
        SqlCommand com = new SqlCommand(sqlCommand, con);

        //přidat parametr 
        com.Parameters.AddWithValue("IdProdukt", Id);
        //otevřít spojení 
        con.Open();
        //vytáhnout výsledek 

        Price = Convert.ToDecimal(com.ExecuteScalar().ToString());

        //zavřít spojení 
        con.Close();

        return Price;
        }

        set {}
    }
    public string Description { get; set; }

    public Product(int id)
    {
        {
            this.Id = id;
            this.Description = "IdProdukt: " + id;
            this.Price = Price;
        }
    }
        
        } 

Ale vždy se vyhodí vyjímka u DataBindu pro GridView stránky zobrazující nákupní košík:

TargetInvocationException - InvalidOperationException - {"Přístupová metoda vlastnosti Description pro objekt CartItem vyvolala výjimku: Vlastnost ConnectionString nebyla inicializována.."}

Když vyjímku ošetřím, tak se košík zobrazí, ale údaje nikoliv. Je možné to takto vůbec napojit na databázi? Děkuji Všem

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vždyť tam máte napsané, co se děje. Stačí tu hlášku přečíst.

Nevím, jestli v řádku, kde vytahujete ConnectionString z AppSettings, máte špatně "mujconnectstring", anebo jestli ten connection string máte vůbec v konfiguraci v té sekci, protože tam nepatří.

ConnectionStringy se dávají do web.configu do na to určené sekce ConnectionStrings. Dostanete se k němu z kódu pak takto:

string connStr = ConfigurationManager.ConnectionStrings["nazev"].ConnectionString;

Ukládat je do AppSettings je hloupost.

Mimochodem nechápu, proč to řešíte takto - když budete mít v košíku 20 pooložek, tak uděláte 20 dotazů do databáze, což je na lokálním stroji sice rychlé, ale v situaci, kdy webserver a databáze jsou na jiných počítačích (u webhostingů je to běžné), to už dost zdržuje a je to velmi neefektivní.

Není lepší mít košík jen jako kolekci IDček produktů a ceny, popisy atd. si vytáhnout najednou pro celou kolekci jedním dotazem?

SELECT * FROM Products WHERE ID IN (1, 15, 18, 236)

Výsledek můžete přímo zobrazit v GridView, aby bylo vidět, co je v košíku.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Moc Vám děkuji za cenné rady. Už mi to funguje tak jak jsem potřeboval. Ano máte pravdu, že to je neefektivní, ale jedná se o opravdu malý obchůdek s pár produkty.

Moje hlavní chyba byla, že jsem načítání z databáze dával do třídy Product, přitom to má být ve třídě CartItem.

Třída CartItem:

  
using System;
using System.Data.SqlClient;
using System.Configuration;

/** 
 * The CartItem Class 
 * 
 * Basically a structure for holding item data 
 */
public class CartItem : IEquatable<CartItem>
{
    #region Properties

    // A place to store the quantity in the cart  
    // This property has an implicit getter and setter.  
    public int Quantity { get; set; }

    private int _productId;
    public int ProductId
    {
        get { return _productId; }
        set
        {
            // To ensure that the Prod object will be re-created  
            _product = null;
            _productId = value;
        }
    }

    private Product _product = null;
    public Product Prod
    {
        get
        {
            // Lazy initialization - the object won't be created until it is needed  
            if (_product == null)
            {
                _product = new Product(ProductId);
            }
            return _product;
        }
    }

    public string Description
    {
        get {
            //sestavit connectionString a SQL dotaz 
            string connStr = ConfigurationManager.ConnectionStrings["skateshopConnectionString"].ConnectionString;
            string sqlCommand = "SELECT [Nazev] FROM [Produkty] WHERE [IdProdukt] = @IdProdukt";


            //vytvořit připojení k databázi 
            using (SqlConnection con = new SqlConnection(connStr))
            {
                //vytvořit příkaz 
                using (SqlCommand com = new SqlCommand(sqlCommand, con))
                {
                    //přidat parametry 
                    com.Parameters.AddWithValue("IdProdukt", _productId);
                    //otevřít spojení 
                    con.Open();
                    //vytáhnout výsledek 
                    Prod.Description = com.ExecuteScalar().ToString();

                    //zavřít spojení 
                    con.Close();
                }
            }
            
            
            return Prod.Description; }
    }

    public decimal UnitPrice
    {
        get {
            //sestavit connectionString a SQL dotaz 
            string connStr = ConfigurationManager.ConnectionStrings["skateshopConnectionString"].ConnectionString;
            string sqlCommand = "SELECT [Cena] FROM [Produkty] WHERE [IdProdukt] = @IdProdukt";


            //vytvořit připojení k databázi 
            using (SqlConnection con = new SqlConnection(connStr))
            {
                //vytvořit příkaz 
                using (SqlCommand com = new SqlCommand(sqlCommand, con))
                {
                    //přidat parametry 
                    com.Parameters.AddWithValue("IdProdukt", _productId);
                    //otevřít spojení 
                    con.Open();
                    //vytáhnout výsledek 
                    Prod.Price = Convert.ToDecimal(com.ExecuteScalar().ToString());

                    //zavřít spojení 
                    con.Close();
                }
            }
            return Prod.Price;
        }
    }

    public decimal TotalPrice
    {
        get { return UnitPrice * Quantity; }
    }

    #endregion

    // CartItem constructor just needs a productId  
    public CartItem(int productId)
    {
        this.ProductId = productId;
    }

    /** 
     * Equals() - Needed to implement the IEquatable interface 
     *    Tests whether or not this item is equal to the parameter 
     *    This method is called by the Contains() method in the List class 
     *    We used this Contains() method in the ShoppingCart AddItem() method 
     */
    public bool Equals(CartItem item)
    {
        return item.ProductId == this.ProductId;
    }
}   
nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback