问题环路
问题描述:
我有多个foreach
遍历对此我取的工作经历,从Facebook用户的教育历史和插入到这些数据库:问题环路
Result soap = serializer.Deserialize<Result>(ser);
foreach (var item in soap.data)
{
int length = item.education_history.Length;
int lenght2 = item.work_history.Length;
foreach (var edu in item.education_history)
{
length--;
ftr = ftr + "," + edu.name.ToString();
}
foreach (var wrk in item.work_history)
{
lenght2--;
ftr1 = ftr1 + "," + wrk.company_name.ToString();
}
string str1 = "Insert into [Snaps] (Loc_city,Loc_state,Loc_country,Edu_Hist1,Work_Hist1) values ('" + item.current_location.city.ToString() + "','" + item.current_location.state.ToString() + "','" + item.current_location.country.ToString() + "','" + ftr + "','" + ftr1 + "')";
SqlCommand cmd1 = new SqlCommand(str1, con);
cmd1.ExecuteNonQuery();
}
PS:此代码只是为了测试目的因此不使用参数化SQL查询
我我遇到的问题是,当我计算的ftr
和父foreach循环的第一个项目的ftr1
值
foreach (var item in soap.data)
当我将这些值插入到数据库中时,它会追加item
中的第二个数组索引并将其保存在数据库中。此外值ftr
和ftr1
没有得到刷新它追加新的值与以前的那些
我在这里做错了什么?
感谢
答
的问题是,ftr
和ftr1
v在主循环的每次迭代之后,易变的是未被重置,因此值保持与它们连接。
一个解决方案是在主循环的结束同时设置ftr
和ftr1
到null
或空字符串:
foreach (var item in soap.data)
{
foreach (var edu in item.education_history)
{
// ...
}
foreach (var wrk in item.work_history)
{
// ...
}
// ...
ftr = null;
ftr1 = null;
}
然而,更简单的方法将是使用Enumerable.Select方法在LINQ提取值从education_history
和work_history
数组列表,并使用String.Join将它们连接成两个字符串:
foreach (var item in soap.data)
{
var educationNames = item.education_history.Select(i => i.name.ToString());
var ftr = String.Join(",", educationNames);
var previousCompaniesNames = item.work_history.Select(i => i.company_name.ToString());
var ftr1 = String.Join(",", previousCompaniesNames);
var statement = "INSERT INTO [Snaps] (Loc_city,Loc_state,Loc_country,Edu_Hist1,Work_Hist1) VALUES (@city, @state, @country, @educationNames, @previousCompaniesNames)";
var command = new SqlCommand(statement, con);
command.Parameters.Add("@city", SqlDbType.VarChar, 255).Value = item.current_location.city.ToString();
command.Parameters.Add("@state", SqlDbType.VarChar, 255).Value = item.current_location.state.ToString();
command.Parameters.Add("@country", SqlDbType.VarChar, 255).Value = item.current_location.country.ToString();
command.Parameters.Add("@educationNames", SqlDbType.VarChar, 4000).Value = ftr
command.Parameters.Add("@previousCompaniesNames", SqlDbType.VarChar, 4000).Value = ftr1
command.ExecuteNonQuery();
}
这样ftr
和ftr1
变量是在每次迭代处声明的,因此不需要手动重置它们的值。
答
FTR和FTR1没有得到刷新其追加与 前几次
新的价值观是你不刷新它,如果你要使用的每一个新的值迭代然后用
ftr = "";
ftr1 = "";
+0
将这些行放在第一个循环的开头。 – 2012-02-23 09:57:57
它仍然不能正常工作:/ – vini 2012-02-23 12:43:12
@vini您实施了哪种解决方案? – 2012-02-23 12:56:12
第二个记录被多次插入 – vini 2012-02-23 13:00:00