Wprowadzenie :Mimo że OP już zaakceptował odpowiedź, pomyślałem, że lepiej będzie podzielić się moim doświadczeniem, ponieważ wierzę, że podejście, które zamierzam pokazać, jest lepsze niż to zaakceptowane.
Uważam, że najlepszym sposobem przekazania tablic do bazy danych serwera sql jest użycie user defined table type
i c# DataTable
.W twoim przypadku, ponieważ chcesz przekazać tablicę ciągów o jednym wymiarze, jest to dość proste:
Najpierw musisz utworzyć typ tabeli zdefiniowany przez użytkownika w swojej bazie danych:
CREATE TYPE dbo.StringArray As Table (
StringItem varchar(50) -- you can use any length suited for your needs
)
Następnie musisz utworzyć tabelę danych w kodzie c#:
DataTable dt = new DataTable();
dt.Columns.Add("StringItem", typeof(System.String));
Następnie zmień procedurę składowaną, aby zaakceptować ten typ danych jako parametr:
ALTER proc [dbo].[sp_Accessories]
(
@Mode varchar(50)=null,
@id int=null,
@brand varchar(50)=null,
@department varchar(MAX)=null,
@season varchar(50)=null,
@groupname varchar(MAX)=null,
@styles varchar(50)=null,
@combo dbo.StringArray Readonly=null, -- NOTE THIS CHANGE
@combo_color nvarchar(max)=null,
)
as
if @Mode='getsizewise'
begin
select Sizes,SUM(Quantity) from tbl_SizeBreakup where ([email protected]) and
([email protected]) and ([email protected]) and ([email protected]) and ([email protected])
and ([email protected]) and (Total_Add_Qty='Total Quantity')
and comboColumn in(select StringItem from @Combo) -- NOTE THIS CHANGE
Group By Sizes
end
Następnie musisz przekonwertować tablicę ciągów na tabelę danych w kodzie c#.
foreach (string s in YourStringArray) {
string[] temp = {s};
dt.Rows.Add(temp);
}
Dodaj DataTable jako parametr do procedury składowanej:
System.Data.SqlClient.SqlParameter sp = new Data.SqlClient.SqlParameter();
sp.SqlDbType = SqlDbType.Structured;
sp.Value = dt;
sp.ParameterName = "@Combo";
cmd.Parameters.Add(sp);
Buduj i uruchamiaj.
Takie podejście powinno mieć lepszą wydajność niż użycie funkcji zdefiniowanej przez użytkownika sql, a także może być używane do różnych typów danych. jest to jeden z najlepszych powodów, aby go użyć:Rozważ scenariusz, w którym musisz przekazać tablicę dat:podejście csv wymaga, aby sql przekonwertowało każdy ciąg na datę, podczas gdy dzięki temu podejściu możesz po prostu przekazać daty w takiej postaci, w jakiej są, bez konwertowania ich na ciągi, a następnie z powrotem na daty. Możesz także przekazać tablicę 2 wymiarów lub słowniki, wszystko, co musisz zrobić, to utworzyć odpowiedni typ danych zdefiniowany przez użytkownika w swojej bazie danych sql.
Uwaga:kod napisany bezpośrednio tutaj, może być kilka literówek.