Ich habe eine SQL Server 2005-Datenbank. In einigen Prozeduren habe ich Tabellenparameter, die ich als nvarchar
(durch Kommas getrennt) an einen gespeicherten Prozess übergebe und intern in einzelne Werte teile. Ich füge es der SQL-Befehlsparameterliste wie folgt hinzu:
cmd.Parameters.Add("@Logins", SqlDbType.NVarchar).Value = "jim18,jenny1975,cosmo";
Ich muss die Datenbank auf SQL Server 2008 migrieren. Ich weiß, dass es Tabellenwertparameter gibt, und ich weiß, wie man sie in gespeicherten Prozeduren verwendet. Ich weiß jedoch nicht, wie ich einen in einem SQL-Befehl an die Parameterliste übergeben soll.
Kennt jemand die korrekte Syntax der Parameters.Add
Prozedur? Oder gibt es eine andere Möglichkeit, diesen Parameter zu übergeben?
c#
sql-server
stored-procedures
sqlcommand
table-valued-parameters
Marek Kwiendacz
quelle
quelle
Antworten:
DataTable
,,DbDataReader
oderIEnumerable<SqlDataRecord>
Objekte können verwendet werden, um einen Parameter mit Tabellenwert gemäß dem MSDN-Artikel Tabellenparameter in SQL Server 2008 (ADO.NET) zu füllen .Das folgende Beispiel zeigt die Verwendung von a
DataTable
oder anIEnumerable<SqlDataRecord>
:SQL-Code :
C # -Code :
quelle
DataTable
als Parameterwert, setzen SieSqlDbType
aufStructured
undTypeName
an den UDT-Namen der Datenbank.null
.CreateSqlDataRecords
wird niemals zurückkehren,null
wenn ein leererids
Parameter angegeben wird.DataTable
(oderDataSet
) implementieren Sie es nur, weil sie Drag & Drop-Funktionen in Visual-Studio unterstützen müssen, damit sie implementieren,IComponent
welche implementiert werdenIDisposable
. Wenn Sie den Designer nicht verwenden, sondern manuell erstellen, gibt es keinen Grund, ihn zu entsorgen (oder dieusing
Anweisung zu verwenden). Dies ist also eine der Ausnahmen der goldenen Regel "Entsorgen Sie alles, was implementiert wirdIDisposable
".Dispose
Methoden auf, auch wenn es nur so ist, dass mich die Code-Analyse nicht warnt, wenn ich es nicht tue. Ich stimme jedoch zu, dass in diesem speziellen Szenario, in dem BasisDataSet
undDataTable
Instanzen verwendet werden, das AufrufenDispose
nichts bewirken würde.Neben Ryans Antwort müssen Sie auch die Eigenschaft des
DataColumn
' festlegen ,Ordinal
wenn Sietable-valued parameter
mit mehreren Spalten arbeiten, deren Ordnungszahlen nicht in alphabetischer Reihenfolge sind.Wenn Sie beispielsweise den folgenden Tabellenwert haben, der in SQL als Parameter verwendet wird:
Sie müssten Ihre Spalten als solche in C # bestellen:
Wenn Sie dies nicht tun, wird ein Analysefehler angezeigt, bei dem nvarchar nicht in int konvertiert werden konnte.
quelle
Generisch
quelle
Der sauberste Weg, damit zu arbeiten. Angenommen, Ihre Tabelle enthält eine Liste von Ganzzahlen mit dem Namen "dbo.tvp_Int" (An Ihren eigenen Tabellentyp anpassen)
Erstellen Sie diese Erweiterungsmethode ...
Jetzt können Sie einfach einen Tabellenwertparameter in einer Zeile an einer beliebigen Stelle hinzufügen:
quelle
if(paramCollection != null)
Checks am Anfang der Methode ist also in OrdnungIEnumerable
anstelleList
der Signatur verwenden, damit Sie alles übergeben können, wasIEnumerable
nicht nur Listen sind. Da Sie keine spezifische Funktion verwendenList
, sehe ich keinen Grund, dies nicht zu tun unsIEnumerable
Verwenden Sie diesen Code, um einen geeigneten Parameter aus Ihrem Typ zu erstellen:
quelle