У меня есть база данных SQL Server 2005. В нескольких процедурах у меня есть параметры таблицы, которые я передаю хранимому процессу в виде nvarchar
(разделенных запятыми) и внутренне делю на отдельные значения. Я добавляю его в список параметров команды SQL следующим образом:
cmd.Parameters.Add("@Logins", SqlDbType.NVarchar).Value = "jim18,jenny1975,cosmo";
Я должен перенести базу данных в SQL Server 2008. Я знаю, что есть параметры табличных значений, и я знаю, как использовать их в хранимых процедурах. Но я не знаю, как передать его в список параметров в команде SQL.
Кто-нибудь знает правильный синтаксис Parameters.Add
процедуры? Или есть другой способ передать этот параметр?
c#
sql-server
stored-procedures
sqlcommand
table-valued-parameters
Марек Квендач
источник
источник
Ответы:
DataTable
,DbDataReader
илиIEnumerable<SqlDataRecord>
объекты можно использовать для заполнения табличного параметра в соответствии со статьей MSDN Табличные значения в SQL Server 2008 (ADO.NET) .Следующий пример иллюстрирует использование a
DataTable
или anIEnumerable<SqlDataRecord>
:Код SQL :
Код C # :
источник
DataTable
качестве значения параметра, задайтеSqlDbType
дляStructured
иTypeName
имя UDT базы данных.null
.CreateSqlDataRecords
никогда не вернется,null
если дан пустойids
параметр.DataTable
(илиDataSet
) реализуйте его только потому, что они должны поддерживать возможности перетаскивания в Visual-Studio, поэтому они реализуют,IComponent
какие реализацииIDisposable
. Если вы не используете конструктор, а создаете его вручную, нет причин его утилизировать (или использоватьusing
-statement). Так что это одно из исключений из золотого правила «распоряжаться всем, что реализуетIDisposable
».Dispose
методы, даже если это только так, что анализ кода не предупредит меня, если я этого не сделаю. Но я согласен, что в этом конкретном сценарии, где используются базаDataSet
иDataTable
экземпляры, вызовDispose
ничего не сделает.В дополнение к ответу Райана вам также необходимо установить свойство
DataColumn
's,Ordinal
если вы имеете делоtable-valued parameter
с несколькими столбцами, порядковые номера которых расположены не в алфавитном порядке.Например, если у вас есть следующее табличное значение, которое используется в качестве параметра в SQL:
Вам нужно будет заказать ваши столбцы как таковые в C #:
Если вы этого не сделаете, вы получите ошибку разбора, не удалось преобразовать nvarchar в int.
источник
общий
источник
Самый чистый способ работы с ним. Предполагая, что ваша таблица представляет собой список целых чисел с именем "dbo.tvp_Int" (Настройте для своего собственного типа таблицы)
Создать этот метод расширения ...
Теперь вы можете добавить табличный параметр в одну строку в любом месте, просто выполнив это:
источник
if(paramCollection != null)
проверки в начале метода будет хорошоIEnumerable
вместоList
подписи, чтобы вы могли передавать все, что угодноIEnumerable
, а не только списки. Так как вы не используете какую-либо функцию, специфичную дляList
, я не вижу причины не насIEnumerable
Используйте этот код для создания подходящего параметра из вашего типа:
источник