1

わかりましたので、これには説明が必要です。

私がやろうとしているプロセスは、SQL のテーブル関数からデータを取得し、返された値をデータセットに入力することです。次に、このクエリをさらに 2 回実行して、別の数値テーブルをクエリする必要があります。次に、前のクエリと同じテーブルに追加します。これは可能な限り高速である必要があるため、現在、adapter.fill を使用してデータセットを作成し、dataset.merge を使用してそれらすべてを 1 つのテーブルに配置しています。

問題は、クエリが時間とスペースを浪費する重複を返す可能性があることです。このため、重複を停止するために列 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 値をテーブル内の既存の値と照合して、レコードが異なることを確認する必要があります。ただし、設計が必ずしも理想的なアプローチであるとは限りません。

これは高速である必要があるとおっしゃっていたので、すべてのテーブルから必要な行だけを返すストアド プロシージャを記述し、テーブルへの入力を 1 回実行できるとよいでしょう。

それが不可能な場合は、データ ソースごとに同じ DataTable で adapter.Fill を呼び出すことができます。埋めるために DataTable だけを取る Fill オーバーロードを使用し、 docsに従って、同じ主キーを持つ複数のレコードが存在する場合、データをマージします。Fill メソッドを呼び出す方法は、Fill を呼び出すたびに指定した名前で新しい DataTable を作成することです。代わりに、DataTable を 1 つだけ埋める必要があります。

「同じ DataTable で Fill メソッドを複数回使用できます。主キーが存在する場合、受信行は既に存在する一致する行とマージされます。主キーが存在しない場合、受信行は DataTable に追加されます。」

于 2011-08-14T11:33:25.770 に答える