Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
 Медленная запись в DBF черзе OleDb  [new]
|\/|AX
Member

Откуда:
Сообщений: 144
Всем здравствуйте.
Возникла проблема с записью в DBF файл. Нужно добавить в него около 150000 строк, но вставка тянется очень медленно, а файл выходит жутко разбухший.

вот код

        const string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=dBASE IV;User ID=Admin;Password=;";
        const string CreateStatement = "CREATE TABLE {0}(CODE CHAR(20), DISC DOUBLE, CLI INTEGER, NAME CHAR(50), DEL INTEGER)";
        const string InsertStatement = "INSERT INTO {0}(CODE, DISC, CLI, NAME, DEL) VALUES(?, ?, ?, ?, ?)";
            string Connection = String.Format(ConnectionString, path);
            using (OleDbConnection con = new OleDbConnection(Connection))
            {
                con.Open();
                using (OleDbCommand cmd = con.CreateCommand())
                {
                    cmd.CommandText = String.Format(CreateStatement, filename);
                    cmd.ExecuteNonQuery();

                    cmd.CommandText = String.Format(InsertStatement, filename);
                    cmd.Parameters.Add("CODE", OleDbType.Char, 20, "CODE");
                    cmd.Parameters.Add("DISC", OleDbType.Numeric, 5, "DISC");
                    cmd.Parameters.Add("CLI", OleDbType.Numeric, 10, "CLI");
                    cmd.Parameters.Add("NAME", OleDbType.Char, 80, "NAME");
                    cmd.Parameters.Add("DEL", OleDbType.Numeric, 1, "DEL");

                    using (OleDbDataAdapter adapter = new OleDbDataAdapter())
                    {
                        adapter.InsertCommand = cmd;
                        adapter.Update(ds, "DBF");
                    }
                }
            }

Пробовал делать это без адаптера через cmd.ExecuteNonQuery() ничего не убыстряется и не замедляется. Процесс записи еле ползет и конца и края нет. Еще я так понял, что OleDb не особо на типы смотрит. Для нее, что integer, что double.
Пробовал через Odbc вылетает сообщение об ошибке "Недопустимая длина строки или буфера"
6 авг 10, 18:34    [9226400]     Ответить | Цитировать Сообщить модератору
 Re: Медленная запись в DBF черзе OleDb  [new]
LR
Member

Откуда: 8P8C
Сообщений: 2423
вдоволь намучившись "с записью в DBF файл" (перебрав 3-х или 4-х провайдеров) сформулировал и озвучил (руководству, заказчикам) "политическую формулу" - "старая технология (формат DBF) - неизбежные тормоза" (хотя, когда в доисторические времена программастал в фоксе, все летало неимоверно=))

рекомендую вывести проблему в "политическую плоскость" (один факт, что под х64 не существует, и уже наверное не будет существовать драйверов для дбф, дает право это делать)

требуйте XML (у меня, правда, не получилось - обмен данными с госструктурами - их ничем не проймешь )), но требование технически вполне обоснованно)
8 авг 10, 20:43    [9231059]     Ответить | Цитировать Сообщить модератору
 Re: Медленная запись в DBF черзе OleDb  [new]
|\/|AX
Member

Откуда:
Сообщений: 144
LR
...требуйте XML...

Я бы наверно даже тему не заводил, если бы это было возможно )
Я решил проблему таким образом. В msaccess создал необходимые таблицы и функции. Там экспорт в dbf шустро проходит. А уже через interopservices вызываю функцию с параметрами в этой бд и все. 20-25 секунд = dbf (~150000 строк)
Может способ корявый, но работает.
9 авг 10, 11:56    [9233224]     Ответить | Цитировать Сообщить модератору
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить