gpt4 book ai didi

c# - 如何将SQL参数中的字符串数组传递给SQL中的IN子句

转载 作者:行者123 更新时间:2023-12-05 09:22:46 64 4
gpt4 key购买 nike

我正在以复杂的方式做的逻辑。

我只需要在存储过程中执行此查询:

select Sizes, SUM(Quantity)
from tbl_SizeBreakup
where (Brand=@brand)
and (Combo in ('1','2')) ...

我必须在 C# 中使用的 SQL 参数中传递的组合是

DataSet dt = new DataSet();
cmd = new SqlCommand();
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.CommandText = "sp_Accessories";
cmd.Connection = con;

cmd.Parameters.AddRange(
new SqlParameter[] {
new SqlParameter("@Mode",mode),
new SqlParameter("@Combo",combo),
}}

因此,如果我传递 1 个参数,就会按预期工作。我应该传递的组合是 string[](字符串数组)。数组长度可以是任意的,取决于用户在 UI 中的选择。

我的问题是,如何将 string[] 传递给 new SqlParameter("@Combo",combo)

我的存储过程..

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 varchar(50)=null,
@combo_color nvarchar(max)=null,
)
as
if @Mode='getsizewise'
begin
select Sizes,SUM(Quantity) from tbl_SizeBreakup where (Brand=@brand) and (Department=@department) and (Season=@season) and (Group_Name=@groupname) and (Style=@styles)
and (Combo_Color=@color) and (Total_Add_Qty='Total Quantity') Group By Sizes
end

最佳答案

简介:尽管 OP 已经接受了一个答案,但我认为分享我的经验会更好,因为我相信我将要展示的方法比接受的方法更好。

我发现将数组传递到 sql server 数据库的最佳方法是使用 用户定义的表类型 和 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 (Brand=@brand) and
(Department=@department) and (Season=@season) and (Group_Name=@groupname) and (Style=@styles)
and (Combo_Color=@color) and (Total_Add_Qty='Total Quantity')
and comboColumn in(select StringItem from @Combo) -- NOTE THIS CHANGE
Group By Sizes
end

然后您需要在您的 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 将每个字符串转换为日期,而使用这种方法您可以简单地按原样传递日期,而无需将它们转换为字符串然后再转换回日期。此外,您可以传递二维数组或字典,您所要做的就是在您的 sql 数据库中创建适当的用户定义数据类型。

注意:这里直接写代码,可能会有一些错别字。

关于c# - 如何将SQL参数中的字符串数组传递给SQL中的IN子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24879020/

64 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com