c# - 迭代多个 foreach 循环时出现的问题

标签 c# sql c#-4.0 ado.net

我有多个 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查询

我遇到的问题是,当我计算父 foreach 循环中第一项的 ftrftr1 值时

foreach (var item in soap.data)

当我将这些值插入数据库时​​,它会在 item 中附加第二个数组索引并将其保存在数据库中。此外,ftrftr1 的值也没有刷新,它将新值附加到以前的值

我在这里做错了什么?

谢谢

最佳答案

问题是 ftrftr1 变量在主循环中的每次迭代后都不会重置,因此这些值一直是连接到它们。

一种解决方案是在主循环末尾将 ftrftr1 设置为 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_historywork_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();    
}

这样,ftrftr1 变量就会在每次迭代时声明,因此无需手动重置其值。

关于c# - 迭代多个 foreach 循环时出现的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9410593/

相关文章:

C# 使用 RSA DER 格式公钥解密文件

c# - 在特定位置禁用 HttpModule

python - 如何使用 MYSQL/Python/Django 对表中包含相似元素的行进行分组?

mysql - 如何使用一个 SQL 查询计算嵌套表中的行数?

sql - Hive时间戳转换问题

.net - .net 4.0 动态变量的内存是如何分配的?

c# - .net 对象相等

c# - 定义 Python 类

c#-4.0 - 具有商业许可证的 Micro-ORM

c#-4.0 - 如何使用 ajax 或任何其他技术在 ASP.NET MVC 4 中上传图像而无需回发?