You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

循环插入重复值问题排查:多联系人重复插入故障

问题

我有一个最多可添加10个联系人的表单,通过变量获取contactName、contactEmail、contactType字段值,校验后通过存储过程插入数据。当前问题:输入2个联系人时会重复插入2次(即每条联系人数据被插入2次),输入3个则重复插入3次,请问问题出在哪里?

注:所有联系人的ID、EffectiveDate和Activity参数值均相同。

现有C#代码

using (SqlConnection sqlConnection = new SqlConnection(connectionString))
{
    sqlConnection.Open();

    using (SqlCommand sqlCommand3 = new SqlCommand())
    {
        for (int i = 1; (i <= contactCount && i <= 10); i++)
        {
            _contactNameTextBox = FindControl("ContactName" + i + "TextBox") as TextBox;
            _contactEmailTextBox = FindControl("ContactEmail" + i + "TextBox") as TextBox;
            _contactTypeDropDownList = (FindControl("ContactType" + i + "DropDown") as DropDownList);

            if (_contactTypeDropDownList.SelectedValue != "")
            {
                sqlCommand3.CommandText = "usp_ContactsUpdate";
                sqlCommand3.CommandType = CommandType.StoredProcedure;
                sqlCommand3.Connection = sqlConnection;
                sqlCommand3.Parameters.AddWithValue("ID", id);
                sqlCommand3.Parameters.AddWithValue("EffectiveDate", effectiveDate);
                sqlCommand3.Parameters.AddWithValue("Activity", "Add");

                sqlCommand3.Parameters.AddWithValue("ContactName", _contactNameTextBox.Text.Trim());
                sqlCommand3.Parameters.AddWithValue("ContactEmail", _contactEmailTextBox.Text.Trim());
                sqlCommand3.Parameters.AddWithValue("ContactType", _contactTypeDropDownList.SelectedValue);

                sqlCommand3.ExecuteNonQuery();

                sqlCommand3.Parameters.Clear();
            }
        }
        Label1.Text = "Done";
    }
}

补充存储过程代码

CREATE OR ALTER PROCEDURE dbo.usp_ContactsUpdate
    @ID int,
    @EffectiveDate date,
    @Activity nvarchar(10),
    @ContactType nvarchar(10),
    @ContactName nvarchar(75),
    @ContactEmail nvarchar (75)
AS
BEGIN
    INSERT INTO Contacts_Pending (ID, EffectiveDate, Activity, ContactType, ContactName, ContactEmail)
    VALUES (@ID, @EffectiveDate, @Activity, @ContactType, @ContactName, @ContactEmail)
END
问题原因及修复方案

核心原因

最可能的问题是无法正确获取对应索引的表单控件,导致循环中复用了前一次的联系人数据,重复插入:

  • 如果页面使用了母版页、用户控件或其他NamingContainer(如Panel、GridView),直接调用Page.FindControl()无法找到目标控件——因为容器会修改控件的实际ID(比如母版页的ContentPlaceHolder会给ID添加前缀,如ContentPlaceHolder1_ContactName1TextBox),此时FindControl返回null,但代码未做空值判断,导致复用了之前循环中赋值的控件变量值。
  • 另一种可能是表单控件的ID命名错误,比如所有联系人的控件ID未按ContactName{N}TextBox、ContactEmail{N}TextBox、ContactType{N}DropDown的规则命名(比如都叫ContactNameTextBox),导致每次FindControl都返回同一个控件,循环多次插入相同数据。

此外,代码存在冗余操作:每次循环都重复设置CommandText、CommandType、Connection属性,虽然不直接导致重复插入,但会影响性能。

修复步骤

  1. 确保正确获取控件

    • 如果使用了母版页,先找到对应的ContentPlaceHolder,再在其中查找控件:
      ContentPlaceHolder contentHolder = Master.FindControl("ContentPlaceHolder1") as ContentPlaceHolder;
      _contactNameTextBox = contentHolder.FindControl("ContactName" + i + "TextBox") as TextBox;
      
    • 检查表单控件的ID是否严格按照ContactName{N}TextBox、ContactEmail{N}TextBox、ContactType{N}DropDown的规则命名,确保索引与循环变量一致。
    • 添加空值判断,避免复用旧值:
      _contactNameTextBox = FindControl("ContactName" + i + "TextBox") as TextBox;
      _contactEmailTextBox = FindControl("ContactEmail" + i + "TextBox") as TextBox;
      _contactTypeDropDownList = FindControl("ContactType" + i + "DropDown") as DropDownList;
      
      // 新增空值判断,避免控件未找到时复用旧数据
      if (_contactNameTextBox == null || _contactEmailTextBox == null || _contactTypeDropDownList == null)
      {
          continue;
      }
      
  2. 优化SqlCommand配置
    将CommandText、CommandType、Connection的设置移到循环外,避免重复操作:

    using (SqlCommand sqlCommand3 = new SqlCommand())
    {
        sqlCommand3.CommandText = "usp_ContactsUpdate";
        sqlCommand3.CommandType = CommandType.StoredProcedure;
        sqlCommand3.Connection = sqlConnection;
    
        for (int i = 1; (i <= contactCount && i <= 10); i++)
        {
            // 控件查找与空值判断...
    
            if (_contactTypeDropDownList.SelectedValue != "")
            {
                sqlCommand3.Parameters.AddWithValue("ID", id);
                sqlCommand3.Parameters.AddWithValue("EffectiveDate", effectiveDate);
                sqlCommand3.Parameters.AddWithValue("Activity", "Add");
                sqlCommand3.Parameters.AddWithValue("ContactName", _contactNameTextBox.Text.Trim());
                sqlCommand3.Parameters.AddWithValue("ContactEmail", _contactEmailTextBox.Text.Trim());
                sqlCommand3.Parameters.AddWithValue("ContactType", _contactTypeDropDownList.SelectedValue);
    
                sqlCommand3.ExecuteNonQuery();
                sqlCommand3.Parameters.Clear();
            }
        }
        Label1.Text = "Done";
    }
    
  3. 验证contactCount的准确性
    确认contactCount变量的值与实际输入的联系人数量一致,避免循环次数超出实际有效控件数量。


内容的提问来源于stack exchange,提问作者aantiix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:53:18