powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Медленно добавляются записи в БД MSSQL CE
9 сообщений из 9, страница 1 из 1
Медленно добавляются записи в БД MSSQL CE
    #37507925
Kirll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, как ускорить, (или заменить) приведенный код, для ускорения работы.
Указанным способом, записи в БД добавляются крайне медленно (10000 в минуту).
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
  public Boolean SaveDirArray(string dbname, string table,ArrayList array)
        {
            string newbasefilenameCS = @"Data Source=" + setup.AppDir + @"Data\" + dbname + ".sdf;Persist Security Info=False;";
            try
            {
                SqlCeConnection con = new SqlCeConnection(newbasefilenameCS);
                no_result_query("DELETE FROM "+@table+";" , con);
                foreach (string dir in array)
                {
                    var ID = Guid.NewGuid().ToString();
                    no_result_query("INSERT INTO "+table+" ( ID, Dir )  " + "VALUES ('" + ID + "','" + @dir + "');", con);
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
                return false;
            }

            return true;
        }


public int no_result_query(string query, SqlCeConnection connection)
        //Процедура выполнения SQL запроса, не возвращающего результата
        //такого, как insert, delete, update
        //возвращает кол-во затронутых рядов, -1 в случае неудачи
        {
            SqlCeCommand myCommand = new SqlCeCommand(query, connection);
            myCommand.Connection.Open();
            int q_result = myCommand.ExecuteNonQuery();
            myCommand.Connection.Close();
            myCommand.Dispose();
            return q_result;
        }

               

...
Рейтинг: 0 / 0
Медленно добавляются записи в БД MSSQL CE
    #37508130
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kirll,

1. Вставляйте не по одному, а пачками.
2. Если на таблице есть индексы по Id, а Guid.NewGuid() даёт новые значения в случаной порядке - то при вставке ваши индексы каждый раз будут раздвигаться.
3. Купите быстрый жётский диск.
...
Рейтинг: 0 / 0
Медленно добавляются записи в БД MSSQL CE
    #37508839
Kirll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SolYUtorKirll,

1. Вставляйте не по одному, а пачками.
Запросы через ';' не робит, ошибку пишет
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
string sql="";
                foreach (string dir in array)
                {
                    var ID = Guid.NewGuid().ToString();
                    sql += "INSERT INTO " + table + " ( ID, Dir )  " + "VALUES ('" + ID + "','" + @dir + "'); ";
                }
no_result_query(sql, con);
SolYUtor2. Если на таблице есть индексы по Id, а Guid.NewGuid() даёт новые значения в случаной порядке - то при вставке ваши индексы каждый раз будут раздвигаться.
Не понимаю, что раздвигаться будет? Это же получается обычный стринг.

3. Купите быстрый жётский диск.
И так не самый медленный...
...
Рейтинг: 0 / 0
Медленно добавляются записи в БД MSSQL CE
    #37509829
Фотография папа арбуз
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kirll

Код: plaintext
1.
2.
3.
4.
insert into t (id, dir)
select @id1, @dir1 union all
select @id2, @dir2 union all
...
select @idNm @dirN;

или вот еще посмотрите: http://sqlcebulkcopy.codeplex.com/
...
Рейтинг: 0 / 0
Медленно добавляются записи в БД MSSQL CE
    #37509833
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kirll,

в цикле переоткрывать соединение на каждую запись))))))

купи голову.
...
Рейтинг: 0 / 0
Медленно добавляются записи в БД MSSQL CE
    #37511214
Kirll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С Select и Union All что-то у меня не заладилось.
А может команды не поддерживаются SqlCe?

Переделав код повысил скорость до более-менее приемлимой (~6000/сек):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
  public Boolean SaveDirArray(string dbname, string table, ArrayList array)
        {
            string newbasefilenameCS = @"Data Source=" + setup.AppDir + @"Data\" + dbname + ".sdf;Persist Security Info=False;";
            try
           {
                SqlCeConnection con = new SqlCeConnection(newbasefilenameCS);
                no_result_query("DELETE FROM " + @table + ";", con);
                con.Open();
                foreach (string dir in array)
                 {
                    var ID = Guid.NewGuid().ToString();
                    SqlCeCommand com = new SqlCeCommand("INSERT INTO " + @table +" (ID , Dir) VALUES ('" + ID + "','" + @gooddir(dir) + "');", con);
                    com.ExecuteNonQuery();
                 }
                con.Close();
           }
           catch (Exception e)
           {
               MessageBox.Show(e.ToString());
               return false;
           }
          return true;
        }

BulkcopyCe очень заинтересовал. Только не могу найти примеров применения...
...
Рейтинг: 0 / 0
Медленно добавляются записи в БД MSSQL CE
    #37511293
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kirll,

Теперь попробуй prepare/bind
...
Рейтинг: 0 / 0
Медленно добавляются записи в БД MSSQL CE
    #37512361
Фотография папа арбуз
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KirllС Select и Union All что-то у меня не заладилось.

что "не заладилось"? как именно "не заладилось"? просто само по себе взяло и "не заладилось"?

KirllА может команды не поддерживаются SqlCe?

Эээ... даже не знаю что тебе сказать... ты даже гуглом пользоваться не умеешь?
http://technet.microsoft.com/ru-ru/library/ms174854(SQL.90).aspx
...
Рейтинг: 0 / 0
Медленно добавляются записи в БД MSSQL CE
    #37512433
Kirll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для таких же чайников как и я, даю свой вариант применения SqlCeBulkCopy.
Я не ГУРУ C# и Visual Studio поэтому крайне желательны правки и дополнения.

Вот от сюда: http://sqlcebulkcopy.codeplex.com/ качаем архив с dll-ками.
Про их подключение кратко написано http://www.cyberforum.ru/csharp-net/thread37940.html
Или еще проще:
-скопировать в bin\debug проекта
-в обозревателе решений добавить ссылки на данные файлы
-в коде добавить using ErikEJ.SqlCe;

Ниже приведен код, в котором в файл БД сохраняется таблица с двумя столбцами ID и name;
Вначале CreateDataSet().
Затем SaveFilesArray(string dbname)
Скорость записи получилась >40000/сек.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
public static class global
        {//мне удобно таблицы держать в таком виде и иметь к ним доступ из любого места программы
          public static DataSet dsdata = new DataSet("Data");
          public static DataTable dtfolders = new DataTable("Folders");
          public static DataTable dtfiles = new DataTable("Files");
        }     

class DAL
    {
 public void CreateDataSet()
        {
            try
            {
                DataColumn Fi_col_ID = new DataColumn("ID", typeof(Guid));
                Fi_col_ID.ReadOnly = true;
                Fi_col_ID.AllowDBNull = false;
                Fi_col_ID.Unique = true;
                DataColumn Fi_col_name = new DataColumn("Name", typeof(string));
                Fi_col_name.Caption = "Имя";
                global.dtfiles.Columns.AddRange(new DataColumn[] { Fi_col_ID, Fi_col_name });
            }
            catch { MessageBox.Show("Где то косячишь"); }
           }

   public Boolean SaveFilesArray(string dbname)
        {
      //Формируем в памяти таблицу, изначально имеем просто arraylist Fileinfo, потом избавлюсь от этого и буду сразу работать с Datatable
            foreach (FileInfo f in global.files)
             {
             var ID = Guid.NewGuid();
             DataRow newrow = global.dtfiles.NewRow();
             newrow["ID"] = ID; 
             newrow["Name"] = @goodname(f.Name);//goodname нужен на случай если в файле есть '-ковычки. Он делает ''
             global.dtfiles.Rows.Add(newrow);
             }
            global.dsdata.Tables.Add(global.dtfiles);

            //Подготавливаю чистую таблицу в файле БД
            string newbasefilenameCS = @"Data Source=" + setup.AppDir + @"Data\" + dbname + ".sdf;Persist Security Info=False;";
            SqlCeConnection con = new SqlCeConnection(newbasefilenameCS);
            no_result_query("DROP TABLE Files;", con);
            no_result_query("create table Files (ID uniqueidentifier, Name ntext );", con);

            //Экспорт Datatable.Files в файл
            SqlCeBulkCopyOptions options = new SqlCeBulkCopyOptions();
            Boolean keepNulls=true;
            if (keepNulls)  { options = options |= SqlCeBulkCopyOptions.KeepNulls; }
            using (SqlCeBulkCopy bc = new SqlCeBulkCopy(newbasefilenameCS, options))
            {
                try
                {
                    bc.DestinationTableName = "Files";
                    bc.WriteToServer(global.dtfiles);
                }
                catch (Exception e)  { MessageBox.Show(e.ToString()); }
            }
            return true;
   }     }
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Медленно добавляются записи в БД MSSQL CE
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]