J'ai une base de données SQL Server 2005. Dans quelques procédures, j'ai des paramètres de table que je passe à un proc stocké sous forme de nvarchar
(séparés par des virgules) et que je divise en interne en valeurs uniques. Je l'ajoute à la liste des paramètres de commande SQL comme ceci:
cmd.Parameters.Add("@Logins", SqlDbType.NVarchar).Value = "jim18,jenny1975,cosmo";
Je dois migrer la base de données vers SQL Server 2008. Je sais qu'il existe des paramètres de valeur de table et je sais comment les utiliser dans des procédures stockées. Mais je ne sais pas comment en passer un à la liste des paramètres dans une commande SQL.
Quelqu'un connaît-il la syntaxe correcte de la Parameters.Add
procédure? Ou y a-t-il une autre façon de passer ce paramètre?
c#
sql-server
stored-procedures
sqlcommand
table-valued-parameters
Marek Kwiendacz
la source
la source
Réponses:
DataTable
,DbDataReader
Ou lesIEnumerable<SqlDataRecord>
objets peuvent être utilisés pour remplir un paramètre de table d'une valeur par l'article MSDN Paramètres table Valued dans SQL Server 2008 (ADO.NET) .L'exemple suivant illustre l'utilisation de a
DataTable
ou anIEnumerable<SqlDataRecord>
:Code SQL :
Code C # :
la source
DataTable
comme valeur de paramètre, définiSqlDbType
surStructured
etTypeName
vers le nom UDT de la base de données.null
.CreateSqlDataRecords
ne retournera jamaisnull
si unids
paramètre vide est donné .DataTable
(ouDataSet
) l'implémentent uniquement parce qu'ils doivent prendre en charge les capacités de glisser-déposer dans Visual-Studio, ils implémentent donc lesIComponent
implémentationsIDisposable
. Si vous n'utilisez pas le concepteur mais que vous le créez manuellement, il n'y a aucune raison de leusing
supprimer (ou d'utiliser la déclaration). C'est donc l'une des exceptions à la règle d'or "disposer de tout ce qui met en œuvreIDisposable
".Dispose
méthodes, même si ce n'est que pour que l'analyse de code ne me prévienne pas si je ne le fais pas. Mais je suis d'accord que dans ce scénario spécifique où la baseDataSet
et lesDataTable
instances sont utilisées, l'appelDispose
ne ferait rien.Suite à la réponse de Ryan, vous devrez également définir la propriété
DataColumn
'sOrdinal
si vous avez affairetable-valued parameter
à plusieurs colonnes dont les ordinaux ne sont pas classés par ordre alphabétique.Par exemple, si vous avez la valeur de table suivante qui est utilisée comme paramètre dans SQL:
Vous auriez besoin de classer vos colonnes en tant que telles en C #:
Si vous ne le faites pas, vous obtiendrez une erreur d'analyse, échec de la conversion de nvarchar en int.
la source
Générique
la source
La façon la plus propre de travailler avec. En supposant que votre table est une liste d'entiers appelée "dbo.tvp_Int" (personnaliser pour votre propre type de table)
Créez cette méthode d'extension ...
Vous pouvez maintenant ajouter un paramètre de table sur une ligne n'importe où en faisant simplement ceci:
la source
if(paramCollection != null)
vérification en haut de la méthode sera très bienIEnumerable
place deList
la signature, de cette façon vous pouvez passer tout ce qui estIEnumerable
, pas seulement des listes, puisque vous n'utilisez aucune fonction spécifique àList
, je ne vois pas vraiment de raison de ne pas nousIEnumerable
Utilisez ce code pour créer un paramètre approprié à partir de votre type:
la source