我在Asp.Net中有一个列表框,用户可以从中选择一个或多个参数并将其发送到存储过程。参数数量的选择完全取决于用户,因此我不知道用户将从列表框中选择多少个参数。当我单击“提交”按钮并显示在gridview上时,我还想使用这些参数从表中检索数据。我遇到的问题是我可以发送一个参数并从存储过程中检索数据,但我真的不知道如何从列表框中向存储过程发送多个参数。
下面是Asp.Net中单个参数的代码
protected void Button_Click(object sender, EventArgs e)
{
string s = "Submit";
SqlCommand cmd = new SqlCommand(s, con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = lbCT.SelectedItem.Value;
con.Open();
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
gvDS.DataSource = ds;
gvDS.DataBind();
con.Close();
}
下面是我在SQL Server中的存储过程
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [Submit]
@Name VARCHAR(12)
AS
BEGIN
SELECT *
FROM Employee
WHERE Name = @Name
END
答案 0 :(得分:0)
您只发送参数,并使用等于“ =”运算符。与此相反,您应该发送所有选定的项,并用定界符分割参数。
请按照以下步骤操作:
1。为拆分名称创建一个新的sql函数
CREATE FUNCTION dbo.splitstring (@stringToSplit VARCHAR(MAX))
RETURNS
@returnList TABLE ([Name] [nvarchar] (500))
AS
BEGIN
DECLARE @name NVARCHAR(255)
DECLARE @pos INT
WHILE CHARINDEX(',', @stringToSplit) > 0
BEGIN
SELECT @pos = CHARINDEX(',', @stringToSplit)
SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)
INSERT INTO @returnList
SELECT @name
SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
END
INSERT INTO @returnList
SELECT @stringToSplit
RETURN
END
2。更新您的程序
其中的名称(选择dbo.splitstring(@Names))
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [Submit]
@Names VARCHAR(MAX)
AS
BEGIN
SELECT *
FROM Employee
WHERE Name in (Select dbo.splitstring (@Names))
END
3。更新您的Codebehind参数
cmd.Parameters.Add(“ @ Names”,SqlDbType.VarChar).Value =全部加入 带有','
的选定项目
protected void Button_Click(object sender, EventArgs e)
{
string s = "Submit";
SqlCommand cmd = new SqlCommand(s, con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Names", SqlDbType.VarChar).Value = /*join all selected items with ','*/
con.Open();
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
gvDS.DataSource = ds;
gvDS.DataBind();
con.Close();
}