2017-07-11 4 views
0

Ich habe Probleme mit meinem gespeicherten Prozedur-Aufruf hier. Ich versuche, alle meine Informationen von einer gespeicherten Prozedur zu erhalten, die eine einzelne Spalte in eine Datentabelle zurückgibt. Ich bin hier für die meisten Lösungen gefolgt und kann nicht herausfinden, warum es nicht funktioniert. Meine Datentabelle hat eine Primärschlüsseleinschränkung, da mehrere Werte darin enthalten sind. Aber von dem, was ich gelesen habe, ist dies nicht notwendig, da die Fill auf der SqlDataAdapter nur diese Änderungen zusammenführen wird, wenn es eine gibt?Daten von gespeicherter Prozedur abrufen

Hier ist mein Code so weit:

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 

jedoch der Fehler, die ich erhalte, ist:

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

Meine gespeicherten Prozedur Ich rufe eine einfache

Select ID 
From TableName 
Where Reference = @Reference 
ist

ohne wirklich Bedingungen, und ich habe getestet und es gibt etwa 19 einzigartige Aufzeichnungen.

Jede Hilfe wäre willkommen, danke!

+0

Welche Linie werden Sie den Fehler immer auf? – Fabulous

+3

Nun, Sie haben eine Spalte namens ReferenceID erstellt. Sie haben dann angegeben, dass es der Primärschlüssel Ihrer Datentabelle ist, aber Sie haben keine Werte dafür angegeben. Wenn Sie eine gespeicherte Prozedur verwenden, um Ihre Datentabelle aufzufüllen, entfernen Sie einfach alle unnötigen Spaltendefinitionen. Erstellen Sie einfach eine neue DataTable und rufen Sie dann Ihre Fill-Methode auf. –

+0

@Fabulous der Fehler Ich bekomme diese Zeile auf (und die Ausnahme abfangen) ist auf der sqlAdp.Fill. Und @Sean Ich verstehe, dass es als Primärschlüssel festgelegt ist, aber es bedeutet nicht, dass ich keinen Primärschlüssel als die Werte auffüllen kann, nein? Wenn Sie jedoch den Fill-Befehl in MSDN lesen, scheint das 'Fill' nur das erste Ergebnis zu erhalten. – Phlex

Antwort

0

Sie definieren einen nicht null Primärschlüsseldatenspalte in der Tabelle mit dem Namen „referenceId“:

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

jedoch Ihre SQL-Abfrage nicht eine 1ReferenceID1 Spalte auswählen, ist es eine Spalte ID gestattet die Auswahl:

Select ID 
From TableName 
Where Reference = @Reference 

Deshalb, wenn Sie gehen, um Ihre Tabelle zu füllen erhalten Sie den Fehler:

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

Da die Nicht-Null-Einschränkung, die Sie für "ReferenceID" festgelegt haben, verletzt wird.

Ihre Suche verfeinern:

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

Und Sie sollten eingestellt werden (unter der Annahme, dass ID eindeutig und nicht null ist)

Verwandte Themen