1

好的,所以这需要一些解释。

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

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

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

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

        com = New SqlCommand(sqlPN, myConnect)
        adapter.SelectCommand = com

        adapter.Fill(temp, "Table(0)")
        Dim data As New DataSet
        data = temp
        temp.Tables(0).Columns(3).Unique = True

        firstSet = temp.Tables(0).Rows.Count
        temp.AcceptChanges()
        If temp.Tables(0).Rows.Count < maxRecords Then
            Dim sqlAlt As String = "select Top " & (maxRecords + 10 - temp.Tables(0).Rows.Count) & " * from getAltEnquiry('" & tbSearchFor.Text & "') ORDER BY spn_partnumber"
            adapter.SelectCommand.CommandText = sqlAlt
            adapter.FillLoadOption = LoadOption.OverwriteChanges
            adapter.Fill(temp, "Table(1)")
            For i = 0 To temp.Tables(1).Rows.Count - 1
                Try
                    temp.Tables(0).ImportRow(temp.Tables(1).Rows(i))
                Catch e As Exception
                End Try
            Next
        End If
        If temp.Tables(0).Rows.Count < maxRecords Then
            Dim sqlSuPN As String = "select Top " & (maxRecords + 5 - temp.Tables(0).Rows.Count) & " * from getSuPNEnquiry('" & tbSearchFor.Text & "') ORDER BY spn_partnumber"
            adapter.SelectCommand.CommandText = sqlSuPN
            adapter.Fill(temp, "Table(2)")
            For i = 0 To temp.Tables(2).Rows.Count - 1
                Try
                    temp.Tables(0).ImportRow(temp.Tables(2).Rows(i))
                Catch e As Exception
                End Try
            Next
        End If</code>

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

4

1 回答 1

2

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

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

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

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

于 2011-08-14T11:33:25.770 回答