我正在寻找ADO.NET中的howto或某位专家,他们可以解释我如何正确解决以下场景:
我在数据集中有两个数据表:
表格在数据库级别通过ParentID
ParentTable
中的标识列链接在一起。
两个表都是绑定到GUI上单独DataGridView
的数据。表之间应该存在“1父/ N子”关系,这意味着如果我在ParentTable
(新用户)中创建一个新条目,我会在子网格中得到一个干净的DataGrid
输入用户的日程安排数据。因此,我为每个表设置了两个DataAdapters
,以将其结果填入DataSet
。我还设置了一个DataRelation
对象,并将其分配给DataSet
,以便按照ParentID
列链接这两个表。此外,当我通过ChildTable
向DataGrid
添加一行时,我使用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
列未填充从数据库中检索到的身份值。
为什么呢?我开始在这个问题上松开了一大堆头发......
答案 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和参数定义(如果有的话)。