2011-08-12 36 views
1

好吧,這需要做一些解釋。用主鍵填充數據表的SQLDataAdapter會產生錯誤並退出sub

我想要做的過程是從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> 

感謝任何幫助或建議^ __^

回答

2

因爲你是循環通過從其他查詢記錄,並使用ImportRow,你的代碼會如果超過一個紀錄,拋出一個異常嘗試插入主鍵字段中的相同值。這是以這種方式使用主鍵的目的。如果你想確保你的表只有唯一的記錄,你需要確保記錄是不同的,然後通過檢查表中已有的新行的part_id值來插入它們。但是,您的設計不一定是理想的方法。

由於您提到這需要很快,因此如果您可以編寫存儲過程以從所有表中返回所需的行並將其填充到表中,那麼可能會最好。

如果這是不可能的,您可以在每個數據源的相同DataTable上調用adapter.Fill。使用只填充DataTable的填充超載,並且根據docs,如果存在具有相同主鍵的多條記錄,則會將數據合併在一起。您調用Fill方法的方式是使用每次調用Fill時提供的名稱創建一個新的DataTable。相反,您只需填寫一個DataTable。 「

」您可以在同一個DataTable上多次使用Fill方法,如果存在主鍵,則傳入的行將與已存在的匹配行合併,如果沒有主鍵,傳入的行會附加到DataTable中。

+0

哦哇這聽起來很棒我現在會嘗試一下並回復你,我原本以爲我可以編寫一個排序方法,但第一個和第二個查詢需要引用不同的表。 –

+0

好吧,這幫助了很多,我將temp數據集重命名爲數據表,然後將第3列聲明爲主鍵。就像你說的那樣,現在正在修改表格!__^ –

+0

好極了!我很高興這爲你工作! – ShellyFM