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
(可能就是发生的情况)