【问题标题】:SQLDataAdapter filling datatable with primary key produces error and exits subSQLDataAdapter 用主键填充数据表会产生错误并退出子
【发布时间】: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 

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

【问题讨论】:

    标签: vb.net merge dataset primary-key sqldataadapter


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 哦,哇,这听起来棒极了,我现在就试试,然后回复你,我本来以为我可以写一个排序方法,但是第一个和第二个查询需要引用不同的表。跨度>
    • 好的,这很有帮助,我将临时数据集重命名为数据表,然后将第 3 列声明为主键。正如你所说,它现在正在修改表格^__^
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 2017-02-07
    • 1970-01-01
    相关资源
    最近更新 更多