SQLDataAdapter 用主键填充数据表会产生错误并退出子

Posted

技术标签:

【中文标题】SQLDataAdapter 用主键填充数据表会产生错误并退出子【英文标题】:SQLDataAdapter filling datatable with primary key produces error and exits sub 【发布时间】:2011-08-12 14:49:11 【问题描述】:

好的,这需要一些解释。

我正在尝试执行的过程是从 SQL 中的表函数中获取数据,然后用返回的值填充数据集。 然后,我必须再运行两次此查询来查询备用号码表。然后添加到与先前查询相同的表中。 这需要尽可能快,所以我目前使用 adapter.fill 填充数据集,然后使用 dataset.merge 将它们全部放入一个表中。

问题是查询会返回重复,浪费时间和空间,因此我将第 3 列(part_ID)作为停止重复的主键。

当它与 .merge 一起运行时,它会在第一个重复实例时退出,并且不会继续填充。

下面的代码是我用来解决这个问题的,我只是想知道是否有更好更优雅的解决方案。

 com = 新 SqlCommand(sqlPN, myConnect)
        适配器.SelectCommand = com

        适配器。填充(临时,“表(0)”)
        将数据暗淡为新数据集
        数据=温度
        temp.Tables(0).Columns(3).Unique = True

        firstSet = temp.Tables(0).Rows.Count
        temp.AcceptChanges()
        如果 temp.Tables(0).Rows.Count 

感谢您的帮助或建议^__^

【问题讨论】:

【参考方案1】:

由于您正在遍历来自其他查询的记录并使用 ImportRow,因此如果尝试插入多个主键字段中具有相同值的记录,您的代码将引发异常。这就是以这种方式使用时主键的目的。如果你想确保你的表只有唯一的记录,你需要通过检查新行的 part_id 值与表中已有的值来确保记录是不同的,然后再插入它们。但是,您的设计不一定是理想的方法。

由于您提到这需要快速,因此最好编写一个存储过程来仅从所有表中返回您需要的行,然后对表执行一次填充。

如果这不可行,您可以在每个数据源的同一个 DataTable 上调用 adapter.Fill。使用仅填充 DataTable 的填充重载,根据docs,如果存在多个具有相同主键的记录,它将合并数据。调用 Fill 方法的方式是使用您在每次调用 Fill 时提供的名称创建一个新的 DataTable。相反,您只想填充一个 DataTable。

"您可以在同一个 DataTable 上多次使用 Fill 方法。如果存在主键,则传入的行将与已存在的匹配行合并。如果不存在主键,则将传入的行追加到 DataTable。"

【讨论】:

哦,哇,这听起来棒极了,我现在就试试,然后回复你,我本来以为我可以写一个排序方法,但是第一个和第二个查询需要引用不同的表。跨度> 好的,这很有帮助,我将临时数据集重命名为数据表,然后将第 3 列声明为主键。正如你所说,它现在正在修改表格^__^

以上是关于SQLDataAdapter 用主键填充数据表会产生错误并退出子的主要内容,如果未能解决你的问题,请参考以下文章

带有表类型参数的存储过程返回数据但 SqlDataAdapter 不会填充

用主键创建视图?

Django 用主键找不到我的 DetailView

使用 SqlDataAdapter 用新名称填充数据集中的表,代码不完全运行且没有错误

插入后用主键更新表列(在一个语句中)

SqlDataAdapter.Fill - 异步方法