2017-02-27 102 views
1

我不能继续我的下一个任务,我的问题是我不知道如何将我的DGV的返回值与表匹配。UPDATE INNER JOIN WHERE条件

这是我如何加载我的组合框与值/显示部件:

SqlConnection con = new SqlConnection("Data Source=DESKTOP-5V9PS33\\SQLEXPRESS;Initial Catalog=Farmacia;Integrated Security=True"); 
con.Open(); 
SqlCommand sc = new SqlCommand("SELECT ID,ProductName FROM Product", con); 
SqlDataReader reader; 
reader = sc.ExecuteReader(); 
DataTable dt = new DataTable(); 
dt.Columns.Add("ID", typeof(int)); 
dt.Columns.Add("ProductName", typeof(string)); 
dt.Load(reader); 
cmbProductName.ValueMember = "ID"; 
cmbProductName.DisplayMember = "ProductName"; 
cmbProductName.DataSource = dt; 
cmbProductName.Text = ""; 

这是我从我的数据库增值,我DGV:

sc.Parameters.AddWithValue("@SupplierID", cmbSupplier.SelectedValue.ToString()); 
sc.Parameters.AddWithValue("@ProductNameID", cmbProductName.SelectedValue.ToString()); 
sc.Parameters.AddWithValue("@Quantity",txtQuantity.Text); 
sc.Parameters.AddWithValue("@UnitPrice", txtUnitPrice.Text); 
sc.Parameters.AddWithValue("@Markup", txtMarkup.Text); 
sc.Parameters.AddWithValue("@SellingPrice", txtSellingPrice.Text); 
sc.ExecuteNonQuery(); 

这里是我的代码为“接收订单” UPDATE:

SqlConnection con = new SqlConnection("Data Source=DESKTOP-5V9PS33\\SQLEXPRESS;Initial Catalog=Farmacia;Integrated Security=True"); 
con.Open(); 
SqlCommand sc = new SqlCommand("DELETE From PurchaseOrder WHERE ProductNameID = '"+dgvCategory.SelectedCells[1].Value.ToString()+"'", con); 
sc.ExecuteNonQuery(); 
MessageBox.Show("Received"); 

填充DGV加载/刷新:

private void frmPurchaseOrder_Load_1(object sender, EventArgs e) 
{ 
    try 
    { 
     SqlConnection con = new SqlConnection("Data Source=DESKTOP-5V9PS33\\SQLEXPRESS;Initial Catalog=Farmacia;Integrated Security=True"); 
     con.Open(); 
     SqlCommand sc = new SqlCommand("SELECT Supplier,ProductName,PurchaseOrder.Quantity,PurchaseOrder.UnitPrice,PurchaseOrder.Markup,PurchaseOrder.SellingPrice FROM PurchaseOrder Inner Join Supplier ON Supplier.ID = PurchaseOrder.SupplierID Inner Join Product ON Product.ID = PurchaseOrder.ProductNameID", con); 
     SqlDataReader reader; 
     reader = sc.ExecuteReader(); 
     DataTable dt = new DataTable(); 
     dt.Columns.Add("Supplier", typeof(string)); 
     dt.Columns.Add("ProductName", typeof(string)); 
     dt.Columns.Add("Quantity", typeof(int)); 
     dt.Columns.Add("UnitPrice", typeof(float)); 
     dt.Columns.Add("Markup", typeof(float)); 
     dt.Columns.Add("SellingPrice", typeof(float)); 
     dt.Load(reader); 

     for (int x = 0; x < dt.Rows.Count; x++) 
     { 
      string Supplier = dt.Rows[x].ItemArray[0].ToString(); 
      string ProductName = dt.Rows[x].ItemArray[1].ToString(); 
      string Quantity = dt.Rows[x].ItemArray[2].ToString(); 
      string UnitPrice = dt.Rows[x].ItemArray[3].ToString(); 
      string Markup = dt.Rows[x].ItemArray[4].ToString(); 
      string SellingPrice = dt.Rows[x].ItemArray[5].ToString(); 
      string[] row = { Supplier, ProductName, Quantity, UnitPrice, Markup, SellingPrice }; 
      dgvCategory.Rows.Add(row); 
     } 
     con.Close(); 
    } 
    catch (SystemException ex) 
    { 
     MessageBox.Show(ex.ToString()); 
    } 
} 

我的DGV将只返回字符串或“产品”的名称。

这里是我的FullProduct表 Table HERE

窗口形式设计Form

+0

如果我理解正确,你的问题是你不知道如何获得ProductNameID?填充DGV的代码是什么? –

+0

嘿@GiorgosAltanis检查我的新编辑。 –

回答

1

它已经有一段时间,因为我对这样的应用最后的工作,我的道歉,如果事情是不完全正确的...

中当然,返回ProductName,因为dgvCategory.SelectedCells[1]是该行的第二个单元格,并且这对应于查询中的第二个字段,即ProductName。你需要做一些修改:

抓取ID列好,例如:

SELECT Product.ID as pid, Supplier, ...

,并把它添加到您的数据表(pid是我在上面选择的别名):

dt.Columns.Add("pid", typeof(int));

然后添加ID的值作为数据行的标记:

row.Tag = dt["pid"].value; 
dgvCategory.Rows.Add(row); 

最后,你可以使用这个ID(在该行存为Tag):

SqlCommand sc = new SqlCommand("DELETE From PurchaseOrder WHERE ProductNameID = '"+dgvCategory.SelectedCells[1].RowIndex.Tag.ToString()+"'", con); 

注意,我无法测试任何上述情况,那么也许你需要做一些研究。

+0

“标签”方法不一定是最好的方法;您可以在产品ID值的dgv中添加一个“隐藏”列,然后访问该值(请参阅相关文档以了解具体方法)。 –

+0

谢谢兄弟!很有帮助。用这种方法,我设法规范了我所有的表格。 btw的tablename.column名称作为列名真的帮助我很多!谢谢! –