2017-07-11 156 views
0

我似乎在我的存儲過程調用遇到麻煩。我試圖從存儲過程中獲取所有信息,這會將單列返回到數據表中。我一直在跟蹤大多數解決方案,似乎無法弄清楚爲什麼它不起作用。我的數據表有一個主鍵約束,因爲它有多個值。但是,從我讀過的內容來看,這是沒有必要的,因爲SqlDataAdapter上的Fill只會合併這些更改(如果有)。從存儲過程檢索數據

這是到目前爲止我的代碼:

Dim dtValues As New DataTable() 

Dim dtCol As New DataColumn() 
dtCol.ColumnName = "ReferenceID" 
dtCol.DataType = GetType(SqlInt32) 
dtCol.AllowDBNull = False 

dtValues.Columns.Add(dtCol) 
dtValues.PrimaryKey = {dtCol} 

Public Shared Sub ExecStoredProc(ByVal ProcName As String, ByRef connection As SqlConnection, ByRef dtValues As DataTable, ByVal ParamArray args() As Object) 
    Dim sqlCommand As New SqlCommand() 

    For i = 0 To args.Length - 1 Step 2 
     sqlCommand.Parameters.AddWithValue(CStr(args(i)), args(i + 1)) 
    Next 

    sqlCommand.CommandText = ProcName 
    sqlCommand.CommandType = CommandType.StoredProcedure 
    sqlCommand.Connection = connection 

    Dim sqlAdp As New SqlDataAdapter(sqlCommand) 
    ' Fill the table to mess around with. 
    sqlAdp.Fill(dtValues) 

End Sub 

但是,我得到的錯誤是:

Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.

我的存儲過程,我打電話是一個簡單的

Select ID 
From TableName 
Where Reference = @Reference 

真的沒有條件,我測試過,它返回大約19個獨特的記錄。

任何幫助將不勝感激,謝謝!

+0

哪條線是你得到的錯誤? – Fabulous

+3

那麼你創建了一個名爲ReferenceID的列。然後你說它是你的數據表的主鍵,但你沒有提供它的值。如果您使用存儲過程來填充數據表,則只需刪除所有不必要的列定義。只需創建一個新的DataTable,然後調用你的Fill方法。 –

+0

@Fabulous我得到這一行(並捕捉異常)的錯誤是在sqlAdp.Fill。而@Sean我明白它被設置爲主鍵,但這並不意味着我不能設置主鍵而不是填充值,否?但是,閱讀MSDN上的Fill命令,似乎'Fill'只會獲得第一個結果? – Phlex

回答

0

要定義NOT NULL主鍵的數據在你的表稱爲「ReferenceID」列:

Dim dtCol As New DataColumn() 
dtCol.ColumnName = "ReferenceID" 
dtCol.DataType = GetType(SqlInt32) 
dtCol.AllowDBNull = False 

但是,您的SQL查詢不是選擇1ReferenceID1列,它選擇了一個名爲ID柱:

Select ID 
From TableName 
Where Reference = @Reference 

因此,當你去填滿你的表,你得到的錯誤:

Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.

因爲您在「ReferenceID」上設置的非空,唯一約束被違反。

更改您的查詢:

Select ID as [ReferenceId] 
From TableName 
Where Reference = @Reference 

而且你應該設置(假設該ID是唯一的,不爲空)

相關問題