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 不会填充