Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/19: Рейтинг темы: голосов - 19, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 13.01.2014
Сообщений: 10

Совет по работе с mdb Access

13.01.2014, 15:05. Показов 3954. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
всем привет, занимаюсь программингом пром контроллеров, но и прикладным программированием увлекаюсь! нужен совет очень... в общем ситуация такая:
есть база SQL, куда ложатся 1 секундные архивы 200 измеряемых параметров
моя задача по запросу пользователя вытащить данные из этой базы в mdb базу!
я реализовал все это на c# с ADO через oledb...
все работает, но быстродействие меня не устраивает...
получается, что моя прога вставляет в базу в таблицу 3600 значений примерно 3 секунды, но это же долго?
по 200 параметрам она это делает 10 минут...
у меня на работе есть коллега постарше попытнее, он делал такую прогу на с++ по-моему, вобщем у него за 1.5 минуты все это делается...
может он использовал DAO? DAO и c# совместимы? кто что подскажет?

Добавлено через 7 минут
вот часть моей экспериментальной проги, данные вставляю из DataTable:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
MDBcomstring_insert = "INSERT INTO " + Table_name + " (_Value1, _Value2) VALUES (@_Value1, @_Value2)";
OleDbDataAdapter Adapter_MDB = new OleDbDataAdapter(MDBOleDbCommand);
 
                Adapter_MDB.InsertCommand = new OleDbCommand(MDBcomstring_insert);
                Adapter_MDB.InsertCommand.Parameters.Add("@_Value1", OleDbType.Double, 4, "_Value1");
                Adapter_MDB.InsertCommand.Parameters.Add("@_Value2", OleDbType.Double, 4, "_Value2");
                Adapter_MDB.InsertCommand.Connection = MDBOleDbConnection;
 
Adapter_MDB.InsertCommand.Connection.Open();
 
Adapter_MDB.Fill(Test1_Values);
//... обрабатываю таблицу...
Adapter_MDB.Update(Test1_Values);
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.01.2014, 15:05
Ответы с готовыми решениями:

Перехват исключений при работе с файлом MDB
Очень часто в программе возникают исключения со стандартной информацией об ошибках. Хотел бы научиться перехватывать следующие исключения: ...

Базы данных Access (.mdb) + C#
Здравствуйте уважаемые пользователи этого славного форума! У меня есть много вопросов на которые я не могу себе сам ответить не могли бы...

Ввод данных в БД access (mdb) из поля textbox
Имеется БД .mdb и форма ввода данных в приложении посредством textbox Нужно занести данные в БД их этих полей Никак не разберусь и...

16
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
13.01.2014, 17:02
Цитата Сообщение от cypaman Посмотреть сообщение
вот часть моей экспериментальной проги, данные вставляю из DataTable:
DataTable для этого не подходит, он для каждой записи делает свой INSERT INTO, вам нужна массовая вставка.

Нужно формировать команду вида

SQL
1
2
3
4
5
6
INSERT INTO TABLE
SELECT field1, field1, ...
UNION
SELECT field1, field1, ...
UNION
...
Этот код выполнять через OleDbCommand, метод ExecuteNonQuery
1
0 / 0 / 0
Регистрация: 13.01.2014
Сообщений: 10
14.01.2014, 10:31  [ТС]
пробовал такую форму не работает! как правильно ее написать?

C#
1
2
3
4
5
MDBcomstring = "INSERT INTO " + table_name +
                   " SELECT ('1','1')" +
                   " UNION" +
                   " SELECT ('2','2')" +                        
                   "";
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
14.01.2014, 11:00
cypaman, что вас сподвигло вставить в свой код круглые скобки, которые отсутствуют в оригинале?
0
0 / 0 / 0
Регистрация: 13.01.2014
Сообщений: 10
14.01.2014, 11:16  [ТС]
Цитата Сообщение от kodv Посмотреть сообщение
cypaman, что вас сподвигло вставить в свой код круглые скобки, которые отсутствуют в оригинале?
попробовал по всякому, в том числе и так:
C#
1
2
3
4
5
MDBcomstring = "INSERT INTO " + table_name +
" SELECT '1','1'" +
" UNION" +
" SELECT '2','2'" +
"";
не работает
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
14.01.2014, 11:21
Цитата Сообщение от cypaman Посмотреть сообщение
не работает
Не вставляет данные или не ошибка какая?
0
0 / 0 / 0
Регистрация: 13.01.2014
Сообщений: 10
14.01.2014, 11:21  [ТС]
Цитата Сообщение от Grishaco Посмотреть сообщение
Не вставляет данные или не ошибка какая?
программа в ошибку уходит данные не появляются в таблице...
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
14.01.2014, 11:25
Цитата Сообщение от cypaman Посмотреть сообщение
не работает
Ну вам же не просто сообщение выдается "не работает". Наверняка, есть какая то конкретная информация, почему не работает (текст ошибки или исключения). Какой смысле ее скрывать от общественности? Опубликуйте ее здесь.

Добавлено через 2 минуты
Есть подозрение на то, что у вас не 2 колонки в вашем table_name ...
0
0 / 0 / 0
Регистрация: 13.01.2014
Сообщений: 10
14.01.2014, 11:26  [ТС]
Цитата Сообщение от kodv Посмотреть сообщение
Ну вам же не просто сообщение выдается "не работает". Наверняка, есть какая то конкретная информация, почему не работает (текст ошибки или исключения). Какой смысле ее скрывать от общественности? Опубликуйте ее здесь.

Добавлено через 2 минуты
Есть подозрение на то, что у вас не 2 колонки в вашем table_name ...
ругается: "В инструкции INSERT INTO ('1') отсутствует имя результирующего поля."

колонки 2 я проверял
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
14.01.2014, 11:28
Цитата Сообщение от cypaman Посмотреть сообщение
В инструкции INSERT INTO ('1') отсутствует имя результирующего поля.
Может access требует явного указания полей?
SQL
1
2
3
4
5
6
INSERT INTO TABLE(field1, field1, ...)
SELECT field1, field1, ...
UNION
SELECT field1, field1, ...
UNION
...
0
0 / 0 / 0
Регистрация: 13.01.2014
Сообщений: 10
14.01.2014, 11:31  [ТС]
пробовал перекладвать из одной таблицы в базе в другую все получилость...
но мне та надо быстро вставить из DataTable...
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
14.01.2014, 11:37
Цитата Сообщение от cypaman Посмотреть сообщение
но мне та надо быстро вставить из DataTable
Я вам в самом начале написал, что DataTable не подходит для вставки больших объемов данных.
0
0 / 0 / 0
Регистрация: 13.01.2014
Сообщений: 10
15.01.2014, 10:17  [ТС]
Цитата Сообщение от Grishaco Посмотреть сообщение
Я вам в самом начале написал, что DataTable не подходит для вставки больших объемов данных.
эт я понимаю( сижу вот думаю что делать теперь

Добавлено через 22 часа 18 минут
вообщем по ссылке http://stackoverflow.com/quest... cess-table нашел как вставлять мультистрочно в access

но по факту ограничение имеется max 49 строк!
в итоге протестировал и получил туже производительность((

у коллеги спросил - говорит на ADO на с++ делал...

опытные что мне делать? стоит мне переделать все на ADO или я не получу увеличения производительности в 5 или более раз? в c# вообще возможно ADO использовать?

Добавлено через 3 минуты
код мой получился такого вида:

C#
1
2
3
4
5
6
7
8
9
10
MDBcomstring = "INSERT INTO " + table_name + "(_Value1, _Value2)" +
                       " SELECT * FROM (SELECT '1' as _Value1, '111' as _Value2 FROM tmp" +
                       " UNION ALL" +
                       " SELECT '2' as _Value1, '222' as _Value2 FROM tmp" +
                       " UNION ALL" +
                       " SELECT '3' as _Value1, '333' as _Value2 FROM tmp" +
                       " UNION ALL" +
                       " SELECT '4' as _Value1, '444' as _Value2 FROM tmp" +
                       ") as tmp";
                       // и так далее до 49 строк
tmp это однострочная временная таблица согласно инфе по ссылке...
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
15.01.2014, 12:19
cypaman, По ссылке реализован вариант, который вам предлагал Grishaco. Чувствовал, что есть подводные камни с переброской 3600 строк этим вариантом, но не стал встрявать со своим вариантом с DataReader и DataCommand. Выглядит он примерно так:
C#
1
2
3
4
5
6
7
8
DbDataReader dataReader = MBOleDBCommand.ExecuteReader();
while(dataReader.Read())
{
    // insertCommand аналогичен Adapter_MDB.InsertCommand из вашего кода. Оъявите самостоятельно, но до этого цикла.
    insertCommand.Parameters[@_Value1] = dataReader[_Value1];
    insertCommand.Parameters[@_Value2] = dataReader[_Value2];
    insertCommand.ExecuteNonQuery();
}
Не знаю, насколько быстрее он будет работать, но в теории должен работать быстрее.
Цитата Сообщение от cypaman Посмотреть сообщение
в c# вообще возможно ADO использовать?
Можно. Добавляйте в проект ссылку на ADO (Microsoft Active X Data Objects Library) и используйте объекты ADO из пространства имен ADODB.
1
0 / 0 / 0
Регистрация: 13.01.2014
Сообщений: 10
16.01.2014, 10:32  [ТС]
вобщем перешел на ADO
протестил вставку в таблицу - 720 000 вставок занимает 14 секунд меня это капец как обрадовало))

но не могу разобраться пока как вставить в два столбца в одной строке

экспериментальный код следующий:
C#
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
string ADO_conn_string = "provider=Microsoft.Jet.OLEDB.4.0; data source=" + @"D:\Виталик\Работа\Проекты VisualStudio\UpdateTable\UpdateTable\bin\Release\" + "testing_ADO" + ".mdb";
                ADODB.Connection ADO_conn = new ADODB.Connection();
                ADODB.Recordset ADO_rs = new ADODB.Recordset();
 
                string ADO_request_string = "select * from test1";
 
                ADO_conn.ConnectionString = ADO_conn_string;
 
                try
                {
                    ADO_conn.Open(ADO_conn_string, "", "", 0);
                    Console.WriteLine(ADO_conn.State);
 
                    ADO_rs.Open(ADO_request_string, ADO_conn, ADODB.CursorTypeEnum.adOpenDynamic, ADODB.LockTypeEnum.adLockOptimistic, 0);
                    Console.WriteLine(ADO_rs.State);
 
                    //string tmpstr = "333";
 
                    Console.WriteLine("статус rs " + ADO_rs.DataSource);
 
                    string[] ar1 = new string[] { "_Value1", "_Value2" };
                    int[] ar2 = new int[] { 222, 333 };
 
                    for (int i = 0; i < 720000; i++)
                    {
                        ADO_rs.AddNew("_Value1", "111");
                        ADO_rs.AddNew("_Value2", "222");
                        
                        //пробовал так не принимает ругается что не может найти по индексу...
                        //ADO_rs.AddNew(ar1, ar2);
 
                        //при использовании этой строки заменяет значение 111 каждый раз на 333
                        //ADO_rs.Update("_Value1", "333");
 
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Ошибка! " + ex.Message);
                    ADO_rs.Close();
                    ADO_conn.Close();
                    Thread.Sleep(30000000);
                    Environment.Exit(0);
                }
                finally
                {
                    ADO_rs.Close();
                    ADO_conn.Close();
                    Console.WriteLine(ADO_conn.State);
                }
вобщем в таком виде вставляет в таблицу не строчками а по очереди, то есть вначале вставляет в 1ый столбец, в следующей строке во 2ой и т.д...

код ADO_rs.AddNew() и ADO_rs.Update() не принимает без аргументов...

Добавлено через 53 минуты
еще вопрос почему данные вставляются не по порядку а с некоторой перемешкой?

Добавлено через 18 часов 52 минуты
по поводу вставки данных вперемешку разобрался - до этого пробывал в существующую базу вставлять каждый раз вручную очищая таблицу, но сейчас переделал на то, что каждый раз создаю базу и таблицу заново и все ок с порядком данных

остается нерешенным вопрос со вставкой строки в 2 столбца!
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
16.01.2014, 10:33
Лучший ответ Сообщение было отмечено tezaurismosis как решение

Решение

Цитата Сообщение от cypaman Посмотреть сообщение
C#
1
2
//пробовал так не принимает ругается что не может найти по индексу...
* * * * * * * * * * * * //ADO_rs.AddNew(ar1, ar2);
Напрямую с ADO не работал, только через Борландовскую надстройку BCB. Поэтому утверждать не буду, но предполагаю, что так может сработать:
C#
1
ADO_rs.AddNew(new object[] {"_Value1", "_Value2"}, new object [] {"111", "222"}); // то есть, не типизированные массивы, а массивы object'ов. В BCB в одобных ситуациях массивы Variant'ов захерачивались.
Цитата Сообщение от cypaman Посмотреть сообщение
еще вопрос почему данные вставляются не по порядку а с некоторой перемешкой?
Ни одна СУБД не гарантирует, что данные в таблице будут хранится в определенном порядке. Для выбора данных по порядку есть ключевое слово ORDER BY.
1
0 / 0 / 0
Регистрация: 13.01.2014
Сообщений: 10
16.01.2014, 12:24  [ТС]
kodv, протестировал ваше предложение
C#
1
ADO_rs.AddNew(new object[] {"_Value1", "_Value2"}, new object [] {"111", "222"});
все отработало как надо!
протестировал производительность мегабыстрая! 3600 строк в таблицу из 2 столбцов вставляет за ~150 мс, используя вставку через OLEDB и команды INSERT или UPDATE DataSeta вставка занимала ~3 сек

в итоге как мне надо 200 таких таблиц теперь код делает все это за 28 сек!!!! вместо 10 минут по OLEDB)))
я очень рад! и спасибо всем за помощь большое!!!

p.s. создаю базу заново по условиям задачи и данные вставляются не в перемешку, все по порядку!

Добавлено через 5 минут
вот итоговый код моей экспериментальной проги:
C#
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
string ADO_conn_string = "provider=Microsoft.Jet.OLEDB.4.0; data source=" + @"D:\Виталик\Работа\Проекты VisualStudio\UpdateTable\UpdateTable\bin\Release\" + "testing_ADO" + ".mdb";
                ADODB.Connection ADO_conn = new ADODB.Connection();
                ADODB.Recordset ADO_rs = new ADODB.Recordset();
 
                string ADO_request_string = "select * from test1";
 
                ADO_conn.ConnectionString = ADO_conn_string;
 
                try
                {
                    ADO_conn.Open(ADO_conn_string, "", "", 0);
                    Console.WriteLine(ADO_conn.State);
 
                    ADO_rs.Open(ADO_request_string, ADO_conn, ADODB.CursorTypeEnum.adOpenDynamic, ADODB.LockTypeEnum.adLockOptimistic, 0);
                    Console.WriteLine(ADO_rs.State); 
 
                    Console.WriteLine("статус rs " + ADO_rs.DataSource); 
 
                    for (int i = 0; i < 3600; i++)
                    {
                      ADO_rs.AddNew(new object[] { "_Value1", "_Value2" }, new object[] { i, i*2 });
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Ошибка! " + ex.Message);
                    ADO_rs.Close();
                    ADO_conn.Close();
                    Thread.Sleep(3000);
                    Environment.Exit(0);
                }
                finally
                {
                    ADO_rs.Close();
                    ADO_conn.Close();
                    Console.WriteLine(ADO_conn.State);
                }
Добавлено через 18 минут
!!! кстати в CSV если писать, то 3600 строк по 200 столбцам записать занимает всего 300мс вместо 28 сек через ADO и 10 мин через OLEDB))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.01.2014, 12:24
Помогаю со студенческими работами здесь

Работа с .mdb (Access) без установки Офиса
Скажите, можно ли работать с базой данных access без установки офиса? Немогу разобраться. На одном компе работает (но там до этого стоял...

Обращение к базе mdb на компe, где не установлен ACCESS
У себя на компе создала базу mdb, обращаюсь к ней через программу на C# Считываю данные из таблиц, обновляю данные. Обращаюсь к базе через...

Как сделать, чтобы в программе на C#.NET открывалась база данных Access (*.mdb)?
Как сделать, чтобы в программе на C#.NET открывалась база данных Access (*.mdb)? Просто открывался выбранный файл mdb, и одна из таблиц...

Как работать с ADO в Access при работе с .mdb
В 2000-м изменили синтаксис работы с записями. Было DAO стало ADO. Галочку ставить в сылках не хочется, поэтому решил разобраться, однако...

Access. Копирование с одной базы b1.mdb содержимое в другую базу b2.mdb
Через ADOConnection1 подключил базу b1.mdb, ADOConnection2 подключил базу b2.mdb. В каждой из баз имеется по одной таблице (в b1.mdb...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru