Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Медленно добавляются записи в БД MSSQL CE / 9 сообщений из 9, страница 1 из 1
02.11.2011, 09:52
    #37507925
Kirll
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленно добавляются записи в БД MSSQL CE
Подскажите, как ускорить, (или заменить) приведенный код, для ускорения работы.
Указанным способом, записи в БД добавляются крайне медленно (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
02.11.2011, 11:53
    #37508130
SolYUtor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленно добавляются записи в БД MSSQL CE
Kirll,

1. Вставляйте не по одному, а пачками.
2. Если на таблице есть индексы по Id, а Guid.NewGuid() даёт новые значения в случаной порядке - то при вставке ваши индексы каждый раз будут раздвигаться.
3. Купите быстрый жётский диск.
...
Рейтинг: 0 / 0
02.11.2011, 15:27
    #37508839
Kirll
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленно добавляются записи в БД MSSQL CE
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
03.11.2011, 01:29
    #37509829
папа арбуз
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленно добавляются записи в БД MSSQL CE
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
03.11.2011, 01:33
    #37509833
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленно добавляются записи в БД MSSQL CE
Kirll,

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

купи голову.
...
Рейтинг: 0 / 0
03.11.2011, 20:31
    #37511214
Kirll
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленно добавляются записи в БД MSSQL CE
С 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
03.11.2011, 21:46
    #37511293
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленно добавляются записи в БД MSSQL CE
Kirll,

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

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

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

Эээ... даже не знаю что тебе сказать... ты даже гуглом пользоваться не умеешь?
http://technet.microsoft.com/ru-ru/library/ms174854(SQL.90).aspx
...
Рейтинг: 0 / 0
05.11.2011, 09:08
    #37512433
Kirll
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленно добавляются записи в БД MSSQL CE
Для таких же чайников как и я, даю свой вариант применения 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
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Медленно добавляются записи в БД MSSQL CE / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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