将多个参数从Asp.Net发送到SQL Server中的存储过程

时间:2018-06-28 20:55:56

标签: asp.net sql-server

我在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

1 个答案:

答案 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();
}