Multiple values in one field (foreign keys?)

2019-09-08 08:05发布

问题:

I am trying to do an Ordering System where you can put many Products in one order. I have very little knowledge about this and this is where i am now

There are 3 tables, Product table,Order table and the Order-products table. I really don't know if this is right as i am beginner especially on foreign keys.

What I want to achieve is you can order many products and put that products into one "OrderID" like this example in pic below.

This are my only codes. Sorry but i am really lost at this.

    public Form1()
    {
        InitializeComponent();
        fillCart();
    }


    private void fillCart()
    {
        dgvCart.ColumnCount = 3;
        dgvCart.Columns[0].Name = "ProductID";
        dgvCart.Columns[1].Name = "ProductName";    
        dgvCart.Columns[2].Name = "Quantity";
    }

    private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        //dgvproducts
    }

    private void Form1_Load(object sender, EventArgs e)
    {
       crud.FillDataGrid("Select * from Products", ref dgvProducts);
       crud.FillDataGrid("Select * from Orders", ref dgvOrder);
       crud.FillDataGrid("Select * from Orderproducts", ref dgvOrderview);
       lbldate.Text = DateTime.Now.ToShortDateString();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        //button add to cart
        addData(dgvProducts.CurrentRow.Cells[0].Value.ToString(), dgvProducts.CurrentRow.Cells[1].Value.ToString(), txtqty.Text);
    }

    private void addData(string p1, string p2, string p3)
    {
        String[] row = { p1, p2, p3 };
        dgvCart.Rows.Add(row);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //button insert

    }

Thank you very much and i hope someone can help me with my problem.

Method use for filling datagridview from SQLserver 2008:

      public crud()
    {
        cnString = "Data Source=DESKTOP-MQKIBSK\\SQLEXPRESS;Initial Catalog=MARISCHELLdatabase;Integrated Security=True";
        cn = new SqlConnection(cnString);
    }



    public void FillDataGrid(string sql, ref ns1.BunifuCustomDataGrid dg)
    {
        try
        {
            DataSet ds = new DataSet();
            cn.Open();
            cmd = new SqlCommand(sql, cn);
            adptr = new SqlDataAdapter(cmd);
            adptr.Fill(ds);
            dg.DataSource = "";
            dg.DataSource = ds.Tables[0];


        }
        catch (Exception e)
        {
            MessageBox.Show("" + e.Message);
        }
        cn.Close();
    }

回答1:

How Linq 2 SQL dataclasses look for me:

The code that goes with it:

//I have 2 columns in my dataGridView, Id 1st amount 2nd
//I added 3 items for testing
List<Tuple<int, int>> cart = new List<Tuple<int,int>>();
foreach (DataGridViewRow row in dataGridView1.Rows)
{
    if (row.Cells[0].Value != null && row.Cells[1].Value != null)
    { 
        cart.Add(new Tuple<int, int>(Convert.ToInt32(row.Cells[0].Value.ToString()),Convert.ToInt32(row.Cells[1].Value.ToString())));
                //Now each list item will have .Item1 (productId) and .Item2 (amount)
    }
}
using (DataClasses1DataContext dataContext = new DataClasses1DataContext())
{
    //The tables you add in the dataContext are accessible by name
    Order order = new Order();
    dataContext.Orders.InsertOnSubmit(order);
    dataContext.SubmitChanges(); // Submit once so we get an orderId
    foreach (Tuple<int, int> product in cart)
    {
        OrderProduct orderProduct = new OrderProduct();
        orderProduct.OrderId = order.OrderID;
        orderProduct.ProductId = product.Item1;
        orderProduct.Amount = product.Item2;
        dataContext.OrderProducts.InsertOnSubmit(orderProduct);
    }
    dataContext.SubmitChanges();
}


回答2:

Create foreign key relationship between Order - OrderProduct over OrderID and Product - OrderProduct over Product ID.

For each Product in order insert a row into OrderProduct with OrderId



回答3:

This may not answer your question completely but consider an object orientated approach to this. It's always better in my opinion to have a strongly typed method of accessing values returned from a database, although others may disagree. Here is some pseudo code to get you started and is by no means the entire solution but should encourage you to think how you can make your code more object orientated and strongly typed. Use the same methodology to save and update tables in your database.

example

    //Business layer
public class Product
{
    public string ProductName {get;set;}
    public int Quantity {get;set;}
    public string Unit {get;set;}
    public decimal Price {get;set;}
    public long Total {get;set;}

    public Product(){}

    public Product(string productName, int quantity, string unit, decimal price, long total)
    {
        ProductName = productName;
        Quantity = quantity;
        Unit = unit;
        Price = price;
        Total = total;
    }

    public List<Product> GetProductList()
    {
        //get the list of products from the data access layer
        ProductDal dal = new ProductDal();
        return dal.GetProductList();
    }
}

//Data layer
public class ProductDal
{
    public List<Product> GetProductList()
    {
        List<Product> lstProducts = new List<Product>();
        //connect to your database code here

        //fill your list with records from your Sql query
        //inside your DataReader while loop you can add a new Product object to your list for each record
        //assuming your database field names match the Product class's proeprties you would do this
        lstProducts.Add(new Product((string)reader["ProductName"],
                                    (int)reader["Quantity"],
                                    (string)reader["Unit"], 
                                    decimal)reader["Price"],
                                    (long)reader["Total"]));

        return lstProducts;
    }
}

//front end code behind page
private void button2_Click(object sender, EventArgs e)
    {
        Product product = new Product();
        dgvCart.DataScource = product.GetProductList();
        dgvCart.DataBind();
    }