一个字段中的多个值(外键?)

时间:2017-02-10 15:11:15

标签: c# sql-server-2008 foreign-keys

enter image description here我正在尝试订购系统,您可以将多个产品放在一个订单中。我对此知之甚少,这就是我现在picture

的地方

有3个表,Product表,Order表和Order-products表。 我真的不知道这是否正确,因为我是初学者,特别是在外键上。

我想要实现的是您可以订购许多产品并将这些产品放入一个“OrderID”,如下图所示。 enter image description here

这是我唯一的代码。对不起,我真的迷失了。

    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

    }

非常感谢,我希望有人能帮我解决问题。

从SQLserver 2008填充datagridview的方法:

      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();
    }

3 个答案:

答案 0 :(得分:1)

Linq 2 SQL数据类如何找我: Linq 2 SQL

随之而来的代码:

//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();
}

答案 1 :(得分:0)

通过OrderID创建Order-OrderProduct和通过Product ID创建Product-OrderProduct之间的外键关系。

对于每个产品,按顺序在OrderProduct中使用OrderId

插入一行

答案 2 :(得分:0)

这可能无法完全回答您的问题,但请考虑采用面向对象的方法。在我看来,使用强类型方法访问从数据库返回的值总是更好,尽管其他人可能不同意。这里有一些伪代码可以帮助您入门,但绝不是整个解决方案,但应该鼓励您思考如何使代码更加面向对象和强类型化。使用相同的方法来保存和更新数据库中的表。

例如

    //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();
    }