Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Быстрое добавление строк в таблицу, Только уникальных строк 
V
    Опции темы
Softaz
Дата 9.7.2006, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


wasm
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 16.1.2006

Репутация: 4
Всего: 16



Задача.
Есть массив строк, которые нужно добавить в таблицу. Обычно их около 500 длиной около 8 байт каждая.
Причем добавлять нужно не все подряд, а только те, которых еще нет в таблице.
С "просто добавлением" все просто - следующий код добавляет их за 0.233 секунды.
Код

 public string SendToDB(string command, Hashtable ht)
        {
            System.Diagnostics.Stopwatch MyWatch = new System.Diagnostics.Stopwatch();
            MyWatch.Start();
            using (System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(connStr))
            {
                conn.Open();
                System.Data.OleDb.OleDbTransaction trans = conn.BeginTransaction();
                System.Data.OleDb.OleDbCommand comm = new System.Data.OleDb.OleDbCommand(command, conn, trans);
                try
                {
                    comm.Parameters.Add("@trash", OleDbType.Char);//.Value = trash;
                    comm.Parameters[0].Size = 1;
                    comm.Prepare();

                    for (int i = 0; i < ht.Count; i++)
                    {
                        comm.Parameters[0].Value =  ht[i + 1].ToString();
                        comm.Parameters[0].Size = ht[i + 1].ToString().Length;
                        comm.ExecuteNonQuery();
                    }

                    trans.Commit();
                }
                catch (OleDbException ex)
                {
                    MessageBox.Show("Внимание! Исправьте ошибку" + Environment.NewLine + Environment.NewLine + ex.Message);
                    trans.Rollback(); // Делаем откат изменений 
                    //return; 
                }
                finally
                {
                    conn.Close();
                }
            }
            MyWatch.Stop();
            return "Elapsed " + MyWatch.ElapsedMilliseconds.ToString() + " ms.";
        }


А с проверкой на отсутствие получалось не менее 30 секунд.
Быстрее всего получается, если обрабатывать исключение OleDbException (указав соотв. поле индексированным с непосторяющимися значениями), а не посылатьдополнительный SELECT-запрос на присутствие.
Код

  public bool SendDB(string command, string connStr)
        {
            using (OleDbConnection conn = new OleDbConnection(connStr))
            {
                conn.Open();
                OleDbTransaction trans = conn.BeginTransaction();
                OleDbCommand comm = new OleDbCommand(command, conn, trans);
                try
                {
                    // Execute выбирай по вкусу, в зависимости от твоих целей
                    comm.ExecuteNonQuery();
                    // Если всё ОК, то проводим транзакцию
                    trans.Commit();
                    return true;
                }
                catch (OleDbException ex)
                {
                    //MessageBox.Show("Внимание! Исправьте ошибку" + Environment.NewLine + Environment.NewLine + ex.Message);
                    trans.Rollback(); // Делаем откат изменений
                    //return;
                    return false;
                }
                finally
                {
                    conn.Close();
                }
            }
        }


А знаете ли Вы, как сделать еще быстрее. Хотя бы до 5 секунд снизить время.
Заранее спасибо. 


--------------------
Разочарованный в .NET
PM MAIL WWW   Вверх
arilou
Дата 10.7.2006, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 4
Всего: 61



Softaz, 

1. сначала делаешь:

Код

SELECT * FROM table WHERE tablevalue IN (тут перечисляешь значения, которые надо проверить)


2. Потом удалешь из своего массива все элементы, которые будут присутствовать после п.1

3. Потом инсертишь все, что осталось.

 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Softaz
Дата 10.7.2006, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


wasm
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 16.1.2006

Репутация: 4
Всего: 16



arilou, Спасибо. 


--------------------
Разочарованный в .NET
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0410 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.