【问题标题】:How to make foreach loop through List<contact>? [duplicate]如何通过 List<contact> 进行 foreach 循环? [复制]
【发布时间】:2012-11-19 15:43:35
【问题描述】:

可能重复:
Insert List<contacts> to table

我有List&lt;Contacts&gt; 我想遍历该列表以使用存储过程添加到数据库中。但我的foreach 循环只会在列表中插入第一个联系人。如何让它调用存储过程来插入所有的联系人?

private static bool Insert_company_contacts(int companyID, List<Contacts> contacts)
{
    // get a configured DbCommand object
    DbCommand comm = GenericDataAccess.CreateCommand();

    // Set the stored procedure name 
    comm.CommandText = "AddContacts";

    // Company Info
    foreach (var c in contacts)
    {
        // create new parameter @LabelContactTypeID
        DbParameter param = comm.CreateParameter();
        param.ParameterName = "@CompanyID";
        param.Value = companyID;
        param.DbType = DbType.Int32;
        comm.Parameters.Add(param);

        // create new parameter @LabelContactTypeID
        param = comm.CreateParameter();
        param.ParameterName = "@LabelContactTypeID";
        param.Value = c.LabelContactTypeID;
        param.DbType = DbType.Int32;
        comm.Parameters.Add(param);

        // create new parameter @ContactDetails
        param = comm.CreateParameter();
        param.ParameterName = "@ContactDetails";
        param.Value = c.ContactDetail;
        param.DbType = DbType.StringFixedLength;
        comm.Parameters.Add(param);

        // create new parameter @Status
        param = comm.CreateParameter();
        param.ParameterName = "@Status";
        param.Value = c.Status;
        param.DbType = DbType.Boolean;
        comm.Parameters.Add(param);

        // create new parameter @Notes
        param = comm.CreateParameter();
        param.ParameterName = "@Notes";
        param.Value = c.Notes;
        param.DbType = DbType.StringFixedLength;
        comm.Parameters.Add(param);

        try
        {
            if (GenericDataAccess.ExecuteNonQuery(comm) == -1)  
                return false;
        }
        catch
        {
            return false;
        }
    }

    return true;
}

【问题讨论】:

  • 好吧,你几乎肯定会遇到一个例外。删除try...catch 块,让我们知道异常是什么。 50 英镑表示您在第一次写入数据库后关闭连接 :)
  • 这种编码风格——带有成功/失败返回码的try/catch——已经过时而且很糟糕。您无法获得有关问题所在的任何信息,因此您无法充分解决问题。
  • 或者他对ExecuteNonQuery() 的调用返回-1。 OP 可以在其中设置一个断点并找出发生了什么吗?

标签: c# asp.net sql-server tsql foreach


【解决方案1】:

您正在循环前面创建一个DbCommand,并在循环内添加参数。因此,在第二次迭代中,您将一组全新的参数添加到您的命令中。

只需像这样将参数的创建移到循环之外:

DbCommand comm = GenericDataAccess.CreateCommand();
//Set the store Proc name 
comm.CommandText = "AddContacts";

DbParameter paramDetails = comm.CreateParameter();
comm.Parameters.Add(paramDetails);
// add other parameters ...

foreach (var c in contacts)
{
    // in the loop, just update parameter values and execute the command
    paramDetails.Value = c.ContactDetail;
    GenericDataAccess.ExecuteNonQuery(comm)
}

此外,在捕获异常时,您不应忽略异常详细信息。 如果你不处理异常,最好不要捕获它。

【讨论】:

    【解决方案2】:

    为什么要退货?当 C# 遇到 RETURN 时,它会退出函数,停止迭代。

    使用另一种方式来了解会发生什么。就个人而言,我使用修改后的行号,

    【讨论】:

    • return false 仅在错误情况下执行(这可能是发生的情况)
    猜你喜欢
    • 2016-12-23
    • 2018-10-09
    • 2017-01-27
    • 2011-02-19
    • 2020-05-23
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多