Mam bazę danych SQL Server 2005. W kilku procedurach mam parametry tabeli, które przekazuję do przechowywanego procesu jako nvarchar
(oddzielone przecinkami) i wewnętrznie dzielę na pojedyncze wartości. Dodaję go do listy parametrów polecenia SQL w następujący sposób:
cmd.Parameters.Add("@Logins", SqlDbType.NVarchar).Value = "jim18,jenny1975,cosmo";
Muszę przeprowadzić migrację bazy danych do SQL Server 2008. Wiem, że istnieją parametry wartości tabeli i wiem, jak ich używać w procedurach składowanych. Ale nie wiem, jak przekazać je do listy parametrów w poleceniu SQL.
Czy ktoś zna poprawną składnię Parameters.Add
procedury? Czy jest inny sposób przekazania tego parametru?
c#
sql-server
stored-procedures
sqlcommand
table-valued-parameters
Marek Kwiendacz
źródło
źródło
Odpowiedzi:
DataTable
,DbDataReader
lubIEnumerable<SqlDataRecord>
obiektów można użyć do wypełnienia parametru wycenianego w tabeli zgodnie z artykułem MSDN Parametry z wartościami przechowywanymi w tabeli w programie SQL Server 2008 (ADO.NET) .Poniższy przykład ilustruje użycie a
DataTable
lub anIEnumerable<SqlDataRecord>
:Kod SQL :
Kod C # :
źródło
DataTable
jako wartość parametru, ustawSqlDbType
naStructured
iTypeName
do nazwy UDT bazy danych.null
.CreateSqlDataRecords
nigdy nie zwróci,null
jeśli otrzyma pustyids
parametr.DataTable
(lubDataSet
) implementują go tylko dlatego, że muszą obsługiwać możliwości przeciągania i upuszczania w Visual-Studio, więc implementują,IComponent
które implementująIDisposable
. Jeśli nie używasz projektanta, ale tworzysz go ręcznie, nie ma powodu, aby go pozbyć (lub użyć instrukcjiusing
-statement). Jest to więc jeden z wyjątków od złotej zasady „pozbądź się wszystkiego, co wdrażaIDisposable
”.Dispose
metody, nawet jeśli jest to tylko po to, aby Analiza kodu nie ostrzegła mnie, jeśli tego nie zrobię. Ale zgadzam się, że w tym konkretnym scenariuszu, w którym używana jest bazaDataSet
iDataTable
instancje, wywołanieDispose
nic nie da.W nawiązaniu do odpowiedzi Ryana, będziesz musiał również ustawić właściwość
DataColumn
',Ordinal
jeśli masz do czynieniatable-valued parameter
z wieloma kolumnami, których liczby porządkowe nie są w porządku alfabetycznym.Na przykład, jeśli masz następującą wartość tabeli, która jest używana jako parametr w języku SQL:
Musisz uporządkować kolumny jako takie w C #:
Jeśli tego nie zrobisz, pojawi się błąd analizy, nie udało się przekonwertować nvarchar na int.
źródło
Ogólny
źródło
Najczystszy sposób na pracę. Zakładając, że Twoja tabela to lista liczb całkowitych o nazwie „dbo.tvp_Int” (dostosuj do własnego typu tabeli)
Utwórz tę metodę rozszerzenia ...
Teraz możesz dodać parametr wartości tabeli w jednym wierszu w dowolnym miejscu, wykonując następujące czynności:
źródło
if(paramCollection != null)
czeku na górze metody będzie w porządkuIEnumerable
zamiastList
w podpisie, w ten sposób możesz przekazać wszystko, co jestIEnumerable
, nie tylko listy, Ponieważ nie używasz żadnej funkcji specyficznej dlaList
, naprawdę nie widzę powodu, aby tego nie robić nasIEnumerable
Użyj tego kodu, aby utworzyć odpowiedni parametr z Twojego typu:
źródło