在一个设置中使用ADO.NET为每个父项插入多个父行和多个子行

时间:2011-11-28 23:30:12

标签: sql vb.net ado.net

我正在寻找ADO.NET中的howto或某位专家,他们可以解释我如何正确解决以下场景:

我在数据集中有两个数据表:

  • 用户数据的ParentTable(ParentID,Name)
  • 计划数据的ChildTable(ParentID,ActivityID,...)

表格在数据库级别通过ParentID ParentTable中的标识列链接在一​​起。

两个表都是绑定到GUI上单独DataGridView的数据。表之间应该存在“1父/ N子”关系,这意味着如果我在ParentTable(新用户)中创建一个新条目,我会在子网格中得到一个干净的DataGrid输入用户的日程安排数据。因此,我为每个表设置了两个DataAdapters,以将其结果填入DataSet。我还设置了一个DataRelation对象,并将其分配给DataSet,以便按照ParentID列链接这两个表。此外,当我通过ChildTableDataGrid添加一行时,我使用SetParentRow来设置父行。

With DAUser
    .SelectCommand = New SqlCommand("UsersSelect", conn)
    .SelectCommand.CommandType = CommandType.StoredProcedure
    .SelectCommand.Parameters.AddWithValue("@UserID", MyID)
    .Fill(DSData)
End With

With DAActivity
    .SelectCommand = New SqlCommand("ActivitiesSelect", conn)
    .SelectCommand.CommandType = CommandType.StoredProcedure
    .SelectCommand.Parameters.AddWithValue("@UserID", MyID)
    .Fill(DSData)
End With

DSData.Relations.Add(New DataRelation("UserActivity", DSData.Tables(0).Columns("ParentID"), DSData.Tables(1).Columns("ParentID")))

在ChildTable中添加行:

Private Sub DTChildData_TableNewRow(sender As Object, e As System.Data.DataTableNewRowEventArgs) Handles DTChildData.TableNewRow
    e.Row.SetParentRow(ParentDataRow)
End Sub

ParentID更新时,ChildTable中的ParentTable列未填充从数据库中检索到的身份值。

为什么呢?我开始在这个问题上松开了一大堆头发......

1 个答案:

答案 0 :(得分:0)

几点说明:

1)两个表之间的关系很可能是不正确的,因为您在关系的两端引用了ParentID。我猜你需要把它改成:

DSData.Relations.Add(New DataRelation("UserActivity", DSData.Tables(0).Columns("UserID"), DSData.Tables(1).Columns("ParentID")))

2)您没有显示插入或更新命令,但如果它们是存储过程并且在该存储过程中生成UserID,则需要将其作为OUTPUT参数从存储过程中传回。您必须在insert / updated命令中更改SP和参数定义(如果有的话)。