Проблемы при переборе нескольких циклов foreach - PullRequest
2 голосов
/ 23 февраля 2012

У меня есть несколько циклов 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 и ftr1 первого элемента в родительском цикле foreach

foreach (var item in soap.data)

и когда я вставляю эти значения в базу данных, он добавляет второй индекс массива в item и сохраняет его в базе данных. Также значения ftr и ftr1 не обновляются, добавляются новые значения с предыдущими

Что я здесь не так делаю?

Спасибо

Ответы [ 2 ]

4 голосов
/ 23 февраля 2012

Проблема в том, что переменные ftr и ftr1 не сбрасываются после каждой итерации в главном цикле , поэтому значения продолжают объединяться с ними.

Одним из решений было бы установить 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 объявляются на каждой итерации , поэтому нет необходимости вручную сбрасывать их значение.

0 голосов
/ 23 февраля 2012

ftr и ftr1 не обновляются, он добавляет новые значения к предыдущим

да, вы не обновляете его, если вы хотите использовать новые значения для каждой итерации, используйте

ftr = "";
ftr1 = "";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...