Wednesday, April 29, 2015

3 Layer architecture with program and website

Hello I hope someone can help me. I'm creating a solution wich holds a program and a website in a 3 layer architecture. Whilst trying to access the data from the database things get dodgy. I'll try to explain my problem.

I use the following projects: 

1. InternalProgram: the application

2. Website: the website ^^

3. BlCommon: wich holds the business logic common to both the site and the internal program

4. DAL: the data acces layer wich holds the database and classes to acces the information wich it holds.

5. Runner: A project to "translate" the dataobjects from the business logic and the DAL database layer. Simply to avoidi circular dependancy

I can show the products from my database in a form inside my internalprogram layer with no issues. The chain I use is the same when I try to acces the same product data in the website layer. However the website layer returns the following error:

An exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll but was not handled in user code

Additional information: An attempt to attach an auto-named database for file C:\<myPathToDatabase>\Database.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.

My connection string is relative: 

Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True

My code requests a list of products:

public static List<ProductDO> GetAllProducts()
        {
            using (SqlConnection connection = getConnection())
            {
                using (SqlCommand command = new SqlCommand("select id, afbeelding, naam, omschrijving, prijs from Producten", connection))
                {
                    connection.Open();
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        List<ProductDO> productsDO = new List<ProductDO>();
                        while (reader.Read())
                        {
                            ProductDO productDO = new ProductDO(
                                                        Convert.ToInt32(reader["id"]),
                                                        reader["afbeelding"].ToString(),
                                                        reader["naam"].ToString(),
                                                        reader["omschrijving"].ToString(),
                                                        Convert.ToDouble(reader["prijs"]));
                            productsDO.Add(productDO);
                        }                        
                        return productsDO;
                    }
                }
            }
        }

That list is sent to the the businessLayer wich converts it to a list of products after converting it from productDO

The code to convert from productDO to product:

public static Product convertFromDo(ProductDO productDO) 
        {
            Product product = new Product(productDO.Id, productDO.AfbeeldingsLocatie, productDO.Naam, productDO.Omschrijving, productDO.Prijs);
            return product;
        }

the code to get the list of products

public static List<Product> GetAllProducts() 
        {
            List<Product> allProducts = new List<Product>();
            
            List<ProductDO> allProductsDO = DataAccess.GetAllProducts();

            foreach (ProductDO pdo in allProductsDO) 
            {
                allProducts.Add(convertFromDo(pdo));
            }

            return allProducts;
        }

the code to display the list of products in my winform: this code works fine

List<Product> allProducts = Product.GetAllProducts();
            foreach (Product p in allProducts)
            {
                labelAllProducts.Text += p.Naam + Environment.NewLine;
                
            }

however when i do the same thing in my website layer:

List<Product> allProducts = Product.GetAllProducts();
        foreach (Product p in allProducts)
        {
            labelAllProducts.Text += p.Naam + "<br />";
        }

it crashes on the dataacces layer line: connection.open();

Can someone plz help me out?

Thx

No comments:

Post a Comment