C# запись из списка в MySql циклом for добавляет 50% списка вместо 100%?

iulius

Client
Регистрация
01.10.2011
Сообщения
56
Благодарностей
3
Баллы
8
Здавствуйте друзья,
Проблема: Запись из списка в MySql с проверкой если запись существует, цикл for проходит ровно 50% списка и выходит без ошибки.
Если в списке 20 сначений проходит 10, если 10 толко 5..., если 2 только 1.
подскажите с чем может быть связанно, и как проити весь список разом.

заранее премного благодарен.

Код:
var links_list = project.Lists["topic_links"];
var result = String.Empty;
var command = new MySql.Data .MySqlClient.MySqlCommand();
var connectionString = "server=localhost;user=root;database=admin;port=3306;password=root;persistsecurityinfo=True;characterset=utf8;";
try{
    command.Connection = new MySql.Data.MySqlClient.MySqlConnection(connectionString);
}
catch (Exception e)
{
    result= "Mysql ошибка подключения";
}

if (links_list==null)
{  
    return "list is epty";
} 
try
{
    command.Connection.Open();
    string category_id = project.Variables["category_id"].Value;

    for(int i=0; i < links_list.Count; i++){
            string link = links_list[i];//list item
            string request = "INSERT INTO wp_parser_links(link, category_id) SELECT * FROM (SELECT @link, @category_id) AS tmp WHERE NOT EXISTS (SELECT link FROM wp_parser_links WHERE link = @link) LIMIT 1;"; //запись если значения не существует

            MySql.Data.MySqlClient.MySqlCommand com = new MySql.Data.MySqlClient.MySqlCommand(request, command.Connection);
          
            com.Parameters.AddWithValue("@link", link);
            com.Parameters.AddWithValue("@category_id", category_id);
            com.ExecuteNonQuery();
            links_list.RemoveAt(i);
    }
}
catch (MySql.Data.MySqlClient.MySqlException e)
{
    result = "Mysql Ошибка "+e.Message;
}
finally
{
    command.Connection.Close();
}
return links_list.Count;
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113
при это список остаётся на половину полный?
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113
попробуйте удалить вот эту строчку - links_list.RemoveAt(i); а то оно поидее удаляет, и у Вас следующий элемент проскакивает (индекс следующего элемента уменьшается может) - в итоге список наполовину полный остаётся, поскольку половина удалена при добавлении
 
  • Спасибо
Реакции: iulius

iulius

Client
Регистрация
01.10.2011
Сообщения
56
Благодарностей
3
Баллы
8

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113
32-ую строку удалите
 
  • Спасибо
Реакции: iulius

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113
я так понимаю, у вас, когда например 2 элемента, первый с индексом 0, второй с индексом 1, при входе в цикл links_list.Count будет равно 2, после первого прохода вы удаляете эелемент с индексом 0, в это же время в списке остаётся 1 элемент и он становится с индексом 0, вы заходите в цикл проверяете links_list.Count, а оно уже равно 1, условие нарушается и цикл завершается.
 
  • Спасибо
Реакции: iulius

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 102
Баллы
113

iulius

Client
Регистрация
01.10.2011
Сообщения
56
Благодарностей
3
Баллы
8
я так понимаю, у вас, когда например 2 элемента, первый с индексом 0, второй с индексом 1, при входе в цикл links_list.Count будет равно 2, после первого прохода вы удаляете эелемент с индексом 0, в это же время в списке остаётся 1 элемент и он становится с индексом 0, вы заходите в цикл проверяете links_list.Count, а оно уже равно 1, условие нарушается и цикл завершается.
спасибо, вы правы )) указывать всегда 0 элемент ) или всетаки вывесть опустошение списка из цикла for?
 
Последнее редактирование:

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113
Код:
for(int i=0; links_list.Count>0; links_list.RemoveAt(i);){}
вот так поробуйте))) это я фантазирую конечно, но по идее может сработать
 
  • Спасибо
Реакции: iulius

iulius

Client
Регистрация
01.10.2011
Сообщения
56
Благодарностей
3
Баллы
8
Код:
for(int i=0; links_list.Count>0; links_list.RemoveAt(i);){}
вот так поробуйте))) это я фантазирую конечно, но по идее может сработать
идеально работает ) гениальное решение. Мерсибо))
без последней ;
Код:
for(int i=0; links_list.Count>0; links_list.RemoveAt(i)){}
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
И ещё неплохо было бы вызывать dispose() после вызова каждой новой команды или оборачивать в using
 
  • Спасибо
Реакции: iulius

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)