使用 asp.net C# 将动态创建的文本字段值插入到同一 ID 的存储过程

Stored Procedure for inserting text field values that is created dynamically to the same id using asp.net C#

我是 ASP.net webforms.Im 的新手,我有一个活动页面,其中我有一个字段可以添加销售渠道负责人邮件 id.when 我点击加号按钮我将能够添加多个销售渠道负责人。

为了使用 Stored procedure.and 将表单值插入到数据库中,它使用一个销售渠道主管电子邮件 ID 插入记录。

我想知道如何编写一个存储过程,用于将动态文本框值插入到 sql 服务器的同一记录(即 ID 和事件名称应该相同)。

这是我的存储过程

CREATE PROCEDURE SPInsertEvent
   @eventName varchar(200),
   @eventDate date,
   @costPerHead varchar(200),
   @totalCost varchar(200),
   @salesChannelHeads varchar(200),
   @salesManagers varchar(200),
   @eventCreationTime datetime
AS
BEGIN
   SET NOCOUNT ON
-- Insert statements for procedure here
   INSERT INTO dbo.hp_event
   (event_name, event_date, cost_per_head, total_cost, sales_channel_head,    sales_manager,    event_creation_time)
   VALUES
   (@eventName, @eventDate, @costPerHead, @totalCost, @salesChannelHeads, @salesManagers, @eventCreationTime)
END

这是我的 ASP.net 函数

SqlCommand cmd = new SqlCommand("SPInsertEvent", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("EventName", txtEventName.Text);
cmd.Parameters.AddWithValue("EventDate", Convert.ToDateTime(txtEventDate.Text));
cmd.Parameters.AddWithValue("CostPerHead", txtTotCostPerHead.Text);
cmd.Parameters.AddWithValue("TotalCost", txtTotalCostEvent.Text);
cmd.Parameters.AddWithValue("SalesChannelHead", txtSalesChannelHead.Text);
cmd.Parameters.AddWithValue("SalesManager", txtSalesManagers.Text);
cmd.Parameters.AddWithValue("EventCreationTime", DateTime.Now);
conn.Open();
int k = cmd.ExecuteNonQuery();
if (k != 0)
{
  string message = "Event added successfully.";
  string script = "window.onload = function(){ alert('";
  script += message;
  script += "')};";
  ClientScript.RegisterStartupScript(this.GetType(), "SuccessMessage", script, true);
}
conn.Close();

你在评论里说了"What i need is a stored procedure for inserting saleschannel heads email id(txtSalesChannelHead,txtSalesChannelHead1,txtSalesChannelHead2) into the sql server table with same id,that is there will be duplicate rows in the table"。从我所看到的您的场景来看,处理动态数量的输入最好不是在存储过程中完成的。更简单的方法是 运行 从您的 .NET 代码中为每个文本框插入一次过程。现在我不知道你的文本框是如何被添加的,所以我不能告诉你如何得到文本框值的集合,但是一旦你有了它,一个简单的 foreach 循环就会让你 运行 存储过程每个人一次。

与其将给定事件的所有电子邮件 ID 列表存储在一个 table 中,我建议您将它们存储在 separate table 中,您可以从hp_event table 随时需要。所以你的数据库设计应该像下面这样 eventid of hp_eventSalesManagers references eventId of hp_event -

要使此设计有效,您可以使用 ADO.NET 中的 Table Valued Parameters 并按照以下步骤操作:

  1. 创建 User Defined Type -

      CREATE TYPE [dbo].[ChannelHeads] As Table
      (    
        EmailIds VARCHAR(50)
      )
    
  2. 每当您单击按钮时填充新数据Table(我正在使用会话来跟踪 以前的数据),下面是 sample 代码:

       protected void btnAdd_Click(object sender, EventArgs e)
        {
            if (Session["DataTable"] == null)
            {
                dataTable = new DataTable();
                dataTable.Columns.Add("EmailIds", typeof(string));
                Session.Add("DataTable", dataTable);
            }
            else
            {
                //If yes then get it from current session
                dataTable = (DataTable)Session["DataTable"];
            }
    
            DataRow dt_row;
            dt_row = dataTable.NewRow();
            dt_row["EmailIds"] = name.Text;
            dataTable.Rows.Add(dt_row);
        }
    
  3. 提交到数据库时添加以下参数(参见我将数据table传递给数据库的方式):

       SqlParameter parameterSalesChannelHeads = new SqlParameter();
       parameterSalesChannelHeads.ParameterName = "@salesChannelHeads";
       parameterSalesChannelHeads.SqlDbType = System.Data.SqlDbType.Structured;
       parameterSalesChannelHeads.Value = (DataTable)Session["DataTable"];
       parameterSalesChannelHeads.TypeName = "dbo.ChannelHeads";
       cmd.Parameters.Add(parameterSalesChannelHeads);
    

    以上述格式更改所有参数只是为了确保您正在使用 Parameters.Add 而不是提到的 Parameters.AddWithValue here

  4. 最后改变程序如下填充tables,below is one of the way, 您可以启用错误处理并改进代码:

      ALTER PROCEDURE SPInsertEvent
        @eventName varchar(200),
        @eventDate datetime,
        @costPerHead varchar(200),
        @totalCost varchar(200),
        @salesChannelHeads As [dbo].[ChannelHeads] Readonly,
        @salesManagers varchar(200),
        @eventCreationTime datetime
     AS
      BEGIN 
      SET NOCOUNT ON
      DECLARE @eventID INT
    
      -- Insert statements for procedure here
      INSERT INTO dbo.hp_event
      (event_name, eventDate, costPerHead, totalCost, eventCreationTime, 
      salesManagers)
      VALUES
      (@eventName, @eventDate, @costPerHead, @totalCost,@eventCreationTime, 
      @salesManagers)
    
      SET @eventID = SCOPE_IDENTITY()
    
      INSERT INTO dbo.hp_eventSalesManagers
       (eventid,event_name,salesChannelHeads)
      SELECT @eventID, @eventName, EmailIds
       FROM 
       @salesChannelHeads 
    
    END
    

最后,按照评论部分中的说明相应地更改字段的数据类型,以便更清晰和使用。