2011-09-17 106 views
0

我有一个使用Visual Studio 2010的配置向导创建的具有两个TableAdapter(1对多关系)的DataSet。DataSet TableAdapter填充方法

我打电话给外部来源,然后用结果填充字典。这些结果应该是数据库中的所有条目。要同步数据库,我不想只清除所有的表,然后重新填充它们,比如删除表并使用sql中的新数据创建它们。

有没有一种干净的方式可能使用TableAdapter.Fill()方法,或者我必须循环遍历两个表,并决定它是否保留或被删除,然后添加新的条目?使字典中的数据成为DataSet中两个表中唯一的数据的最佳方法是什么?

回答

0

第一个问题:如果它是相同的数据库为什么你有2个表具有相同的信息?

对于手头的问题:该largley取决于大小。如果表不大,那么使用事务,清除表(DELETE * FROM TABLE或其他),然后再在那里写入数据。 如果表格很大,问题是:你可以将所有这些加载到你的字典中吗?

当然,你要问自己会发生什么不一致的数据(其他用户/应用程序更改的数据,而你在你的字典里有它)。

如果这需要长期,你可以记住你所做的数据是什么 - 这意味着:标志更改的数据并记住删除键和新插入的行,并根据您的更新。

两者都可以通过记住Filled DataTable并将其用作后台字段或实现自己的机制来实现。

以任何方式,我会建议想想问题:你真的需要字典吗?为什么不对数据库进行查询以获取数据?或者只缓存一部分数据以便快速访问?

PS:在你的更新方法的DataAdapter会做所有的工作(改变改变,删除已删除和插入新的数据行,但它会更新数据表/设定所以这只能使用一次)

+0

我只能访问我正在修改的数据库。另一个数据库是在Active Directory中的某处,我只能通过System.DirectoryServices api访问,所以我将结果存储在散列数据结构中。如果我只能访问DataSet,是否有直接使用sql的方法? – Ben

+0

你可以写入AD数据库吗?如果是这样,为什么要使用你的onw数据库(性能?)也许你可以找到一种方式与AD的数据库专家合作? – Carsten

+0

我只能从AD读取。主要是因为表现,我需要我的老板使用我自己的数据库。它是存储在AD中的一小部分数据,但我不想写入它,因为AD就像主数据库,我模仿它的一小部分。 – Ben

0

它可能是重新填充整个表比重复遍历整个表更快,并决定记录的保留/停留。你可以不通过sql语句来决定是否删除记录吗? (如果你希望他们留在数据库中,但不在数据集中,则从表中删除其中active = false的表)

你可以有一个日期字段并选择所有记录自从你迟到'汇集'数据库的日期之后添加(从*表中选择*,其中active = true和date-added>#12:30#)

+0

我在想,用DataTable和DataRow类创建一个新表可能更容易,然后将它传递给Fill方法?我一直在想一个能够为我做这件事的sql语句,但这会比查看活动列更复杂。我有一张表格,然后是一张带有fk的成员表格,表格归属于他们所属的组织。 – Ben

+1

@Ben SQL是一种强大的数据操纵语言,您可以轻松地从选定的字段创建临时表,甚至可以将其他表彼此附加...也许您需要退后一步,看看更大的图片? – spacemonkeys

+0

希望我能......老板和其他团队成员要求我这样做。 – Ben