首页 > 解决方案 > 将多个参数从 Asp.Net 发送到我在 SQL Server 中的存储过程

问题描述

我在 Asp.Net 中有一个列表框,用户可以从中选择一个或多个参数并将其发送到存储过程。参数数量的选择完全取决于用户,所以我不知道用户要从列表框中选择多少参数。当我单击提交按钮并显示在网格视图上时,我还想使用这些参数从表中检索数据。我遇到的问题是我可以发送一个参数并从我的存储过程中检索数据,但我真的不知道如何将多个参数从列表框发送到我的存储过程。

下面是 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

标签: asp.netsql-server

解决方案


您只发送参数并使用等于“=”运算符。取而代之的是,您应该发送所有选定的项目并按分隔符拆分参数。

请按照以下步骤操作:

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.更新你的程序

WHERE 名称在(选择 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.更新你的代码隐藏参数

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

推荐阅读