如何在SQL visual studio c#中添加表头和详细信息中的数据

时间:2015-12-26 21:27:43

标签: c# sql-server database datagridview datatable

我希望将数据保存在2个表中,并使用不同的数据。

表主数据:KD001(PK),名称

表中的示例PurchaseReuqisition包含:PR001(PK),KD001(FK),日期

表DetailPurchaseRequisition包含:PR001为(PK,FK),KD001为(PK,FK),数量

当我单击添加表时,DetailPurchaseRequisition可以包含重复的id,例如: PR001,KD002

PR001,KD004

这是我的代码:

public void cekdup2()
    {
        for (int row = 0; row < dataGridView2.Rows.Count; row++)
        {
            for (int col = 0; col < dataGridView2.Columns.Count; col++)
            {
                if (dataGridView2.Rows[row].Cells[col].Value != null &&
                  dataGridView2.Rows[row].Cells[col].Value.Equals(txtIdBarang.Text.Trim()))
                {
                    MessageBox.Show("cant add same item!");
                    return;
                }
            }
        }
    }

和按钮添加:

private void btnAdd_Click(object sender, EventArgs e)
    {
        cekdup2();


        if (txtIdBarang.Text == "")
        {
            MessageBox.Show("choose item!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        else if (numQty.Value == 0)
        {
            MessageBox.Show("Qty min 1!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        else
        {
          con.executeUpdate("INSERT INTO DetailPurchaseRequisition VALUES('" + txtIdPermintaanPembelian.Text + "','" + txtIdBarang.Text + "', '" + numQty.Value + "')");
          dataGridView2.DataSource = con.executeQuery("SELECT * FROM DetailPurchaseRequisition");
         }
        }

但是当我点击添加时,theree的某些错误, 如果我填写PR004,它可能是错误的,因为在表PurchaseRequisition中找不到, 但如果我像这个例子一样保存它们:

 con.executeUpdate("INSERT INTO DetailPurchaseRequisition VALUES('" + IdPR.Text + "','" + txtIdBarang.Text + "', '" + numQty.Value + "')");
        con.executeUpdate("INSERT INTO PruchaseRequisition VALUES('" + IdPR.Text + "','" + txtIdBarang.Text + "', '" + numQty.Value + "')");

它将循环保存表PurchaseRequisition吗? 我只想为表PurchaseRequisition节省1次,但可以在表详细信息中保存超过1个数据。

你可以帮我吗? 抱歉我的英文不好

2 个答案:

答案 0 :(得分:1)

您需要设计一个系统来识别新的或现有的主表条目。步骤将是这样的:主键是否存在于主表中?如果没有插入它。然后插入详细记录。

可能可以在C#内存中保存整个主表的副本并在客户端中执行逻辑,但如果表很大则可能存在风险。我建议一个存储过程来完成数据库中的所有操作。您的要求非常简单 - 您事先知道主记录主键,因此您不需要在INSERT之后获取它;并且您一次只添加一条详细记录。

请参阅以下链接:

SQL Server and C# Master / Detail Insert

https://social.msdn.microsoft.com/forums/sqlserver/en-US/2e35e85f-b69c-4041-9548-6db75c2783e2/inserting-data-in-to-master-and-detail-table

答案 1 :(得分:1)

有几条评论可以帮助您找出问题所在。不要按位置执行insert语句。这将使调试这些类型的问题更容易,并防止数据插入错误的列 Insert Into DetailPurchaseRequisition(PR001,KD001,qty)值('“+ IdPR.Text +”','“+ txtIdBarang.Text +”','“+ numQty.Value +”')“);

根据我的判断,您似乎已经完成了PurchaseRequisition的保存,并且想要保存子记录。由于数据库中不存在父记录,您似乎收到错误。

您需要确保在保存PurchaseRequsition之后刷新内存中的对象。一旦该id存在于内存中,您就可以引用它并在随后的insert语句中填充它。