Въведение :Въпреки че ОП вече прие отговор, реших, че би било по-добре да споделя опита си, защото вярвам, че подходът, който ще покажа, е по-добър от приетия.
Намирам, че най-добрият начин за предаване на масиви към sql сървърна база данни е използването на user defined table type
и c# DataTable
.В твоя случай, тъй като искате да предадете масив от низове с едно измерение, това е доста лесно:
Първо трябва да създадете потребителски дефиниран тип таблица във вашата база данни:
CREATE TYPE dbo.StringArray As Table (
StringItem varchar(50) -- you can use any length suited for your needs
)
След това трябва да създадете таблица с данни във вашия C# код:
DataTable dt = new DataTable();
dt.Columns.Add("StringItem", typeof(System.String));
След това променете вашата съхранена процедура, за да приемете този тип данни като параметър:
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
След това трябва да конвертирате низовия масив в dataTable във вашия C# код.
foreach (string s in YourStringArray) {
string[] temp = {s};
dt.Rows.Add(temp);
}
Добавете DataTable като параметър към съхранената процедура:
System.Data.SqlClient.SqlParameter sp = new Data.SqlClient.SqlParameter();
sp.SqlDbType = SqlDbType.Structured;
sp.Value = dt;
sp.ParameterName = "@Combo";
cmd.Parameters.Add(sp);
Създайте и стартирайте.
Този подход трябва да има по-добра производителност от използването на sql дефинирана от потребителя функция и също така може да се използва за различни типове данни. това е една от най-добрите причини да го използвате:Помислете за сценарий, при който трябва да предадете масив от дати:подходът csv изисква sql да преобразува всеки низ в дата, докато с този подход можете просто да предадете датите както са, без да ги конвертирате в низове и след това обратно към дати. Освен това можете да предадете масив с 2 измерения или речници, всичко, което трябва да направите, е да създадете подходящия тип данни, дефиниран от потребителя във вашата sql база данни.
Забележка:кодът е написан директно тук, може да има печатни грешки.