如何通过List <contact>?</contact>进行foreach循环

时间:2012-11-19 15:43:35

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

  

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

我有List<Contacts>我想循环遍历该列表以使用存储过程添加到数据库。但我的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;
}

2 个答案:

答案 0 :(得分: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)
}

此外,在捕获异常时不应忽略异常细节。 如果你不处理异常,最好不要抓住它。

答案 1 :(得分:0)

你为什么要回报?当C#遇到RETURN时,它退出该函数,停止迭代。

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