C# 如何在SQL Server存储过程中创建动态参数

C# 如何在SQL Server存储过程中创建动态参数,c#,asp.net,sql-server,tsql,stored-procedures,C#,Asp.net,Sql Server,Tsql,Stored Procedures,我有一个表单,动态生成输入,然后获取它们的值并动态生成命令参数 SqlConnection con = new SqlConnection(cs); SqlCommand cmd =new SqlCommand("insert_op",con); cmd.CommandType = CommandType.StoredProcedure; for (int i = 0; i < Request.Form.Count; i++) {

我有一个表单,动态生成输入,然后获取它们的值并动态生成命令参数

    SqlConnection con = new SqlConnection(cs);

    SqlCommand cmd =new SqlCommand("insert_op",con);
    cmd.CommandType = CommandType.StoredProcedure;

    for (int i = 0; i < Request.Form.Count; i++)
    {
        if (Request.Form["frm_option" + (i + 1)] != null)
        {

            cmd.Parameters.AddWithValue("@op" + i, Request.Form["frm_option" + (i + 1)]);
        }
    }
    try
    {
        using (con)
        {
            con.Open();
            cmd.ExecuteNonQuery();
        }
    }
    catch
    {
    }
SqlConnection con=新的SqlConnection(cs);
SqlCommand cmd=新的SqlCommand(“insert_op”,con);
cmd.CommandType=CommandType.storedProcess;
for(int i=0;i

如何将这些动态参数传递给SQL Server存储过程?存储过程应该是什么样的?

首先,这不是正确的设计

为了实现您的目标,您需要在SQL语句中传递多个值,如下所示

SQL

INSERT INTO tbl_options(op_name) VALUES (value1),(value2),...(nthValue)
代码

您的代码将是这样的

string command = "INSERT INTO tbl_options(op_name) VALUES";    
for (int i = 0; i < Request.Form.Count; i++)
                {                      
                    if (Request.Form["frm_option" + (i + 1)] != null)
                    {
                        command += "(@op" + i + "),";

                        cmd.Parameters.AddWithValue("@op" + i, Request.Form["frm_option" + (i + 1)]);
                    }
                }
string命令=“插入tbl_选项(操作名称)值”;
for(int i=0;i
首先,这不是正确的设计

为了实现您的目标,您需要在SQL语句中传递多个值,如下所示

SQL

INSERT INTO tbl_options(op_name) VALUES (value1),(value2),...(nthValue)
代码

您的代码将是这样的

string command = "INSERT INTO tbl_options(op_name) VALUES";    
for (int i = 0; i < Request.Form.Count; i++)
                {                      
                    if (Request.Form["frm_option" + (i + 1)] != null)
                    {
                        command += "(@op" + i + "),";

                        cmd.Parameters.AddWithValue("@op" + i, Request.Form["frm_option" + (i + 1)]);
                    }
                }
string命令=“插入tbl_选项(操作名称)值”;
for(int i=0;i
您可以为表中的每个字段提供默认值,因此任何未传入的参数都将获得默认值。这里我演示了NULL的默认值

CREATE PROCEDURE [dbo].[sproc_tbl_options_Insert] 
    @op_name nvarchar(50) = NULL,
    @op_somethingelse nvarchar(5) = NULL,
    @op_number int = NULL
AS
BEGIN
    INSERT INTO [tbl_options] (op_name, op_somethingelse, op_number)
    VALUES (@op_name, @op_somethingelse, @op_number);
END

您可以为表中的每个字段提供默认值,因此任何未传入的参数都将获得默认值。这里我演示了NULL的默认值

CREATE PROCEDURE [dbo].[sproc_tbl_options_Insert] 
    @op_name nvarchar(50) = NULL,
    @op_somethingelse nvarchar(5) = NULL,
    @op_number int = NULL
AS
BEGIN
    INSERT INTO [tbl_options] (op_name, op_somethingelse, op_number)
    VALUES (@op_name, @op_somethingelse, @op_number);
END
如果您想“将每个参数插入单独的行”,那么最好使用表变量作为存储的过程参数

用户定义的表类型和存储过程可能如下所示:

create type dbo.ValueTableType as table (Value varchar(255))
GO

create procedure dbo.InsertValues
    @Values dbo.ValueTableType readonly
as
begin

    insert into dbo.YourTable (Value)
    select Value from @Values;
end
有关如何初始化表参数并将其传递给存储过程的ADO.NET示例,请参见此ADO.NET示例。如果要“将每个参数插入单独的行”,则最好使用表变量作为存储过程参数

用户定义的表类型和存储过程可能如下所示:

create type dbo.ValueTableType as table (Value varchar(255))
GO

create procedure dbo.InsertValues
    @Values dbo.ValueTableType readonly
as
begin

    insert into dbo.YourTable (Value)
    select Value from @Values;
end

请参阅此ADO.NET示例,了解如何初始化表参数并将其传递给存储过程

存储过程应该是什么?我建议将单个参数传递给SP,它应该是csv列表。(我假设所有的值都是表中的一列)。但我想将每个参数插入单独的行中。是的,您将把csv列表传递给存储过程,然后迭代该列表以将其插入表中。存储过程应该是什么样的?我建议将单个参数传递给SP,它应该是csv列表。(我假设所有的值都指向表的一列)。但我想将每个参数插入单独的行中。是的,您将把csv列表传递给存储过程,然后迭代该列表以将其插入表中。