C# 如何通过列表进行foreach循环<;联系方式>;?

C# 如何通过列表进行foreach循环<;联系方式>;?,c#,asp.net,sql-server,tsql,foreach,C#,Asp.net,Sql Server,Tsql,Foreach,可能重复: 我有一个List我想通过该列表循环,使用存储过程添加到数据库中。但是我的foreach循环只会在列表中插入第一个联系人。如何调用存储过程来插入所有联系人 private static bool Insert_company_contacts(int companyID, List<Contacts> contacts) { // get a configured DbCommand object DbCommand comm = GenericDataA

可能重复:

我有一个
List
我想通过该列表循环,使用存储过程添加到数据库中。但是我的
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;
}
private static bool Insert_company_contacts(内部公司ID,列出联系人)
{
//获取已配置的DbCommand对象
DbCommand comm=GenericDataAccess.CreateCommand();
//设置存储过程名称
comm.CommandText=“AddContacts”;
//公司信息
foreach(触点中的var c)
{
//创建新参数@LabelContactTypeID
DbParameter param=comm.CreateParameter();
param.ParameterName=“@CompanyID”;
参数值=公司ID;
param.DbType=DbType.Int32;
通信参数添加(参数);
//创建新参数@LabelContactTypeID
param=comm.CreateParameter();
param.ParameterName=“@LabelContactTypeID”;
参数值=c.LabelContactTypeID;
param.DbType=DbType.Int32;
通信参数添加(参数);
//创建新参数@ContactDetails
param=comm.CreateParameter();
param.ParameterName=“@ContactDetails”;
参数值=c.ContactDetail;
param.DbType=DbType.StringFixedLength;
通信参数添加(参数);
//创建新参数@Status
param=comm.CreateParameter();
param.ParameterName=“@Status”;
参数值=c.状态;
param.DbType=DbType.Boolean;
通信参数添加(参数);
//创建新参数@Notes
param=comm.CreateParameter();
param.ParameterName=“@Notes”;
参数值=c注释;
param.DbType=DbType.StringFixedLength;
通信参数添加(参数);
尝试
{
if(GenericDataAccess.ExecuteNonQuery(comm)=-1)
返回false;
}
抓住
{
返回false;
}
}
返回true;
}

为什么要申报?当C#遇到返回时,它退出函数,停止迭代


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

您在循环前面创建一个
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)
}
此外,在捕获异常时,不应忽略异常详细信息。
如果您不处理异常,最好不要捕获它。

好吧,您几乎肯定会遇到异常。删除
try…catch
块,让我们知道异常是什么。50英镑表示您在第一次写入数据库后就要关闭连接:)这种编码方式(try/catch加上成功/失败返回码)既过时又糟糕。您得不到有关出错原因的任何信息,因此无法采取任何措施来充分处理问题。或者,他对
ExecuteNonQuery()
的调用返回
-1
。OP是否可以在其中设置断点并找出发生了什么情况?仅在错误情况下执行
返回false
(可能就是发生的情况)