Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
 Аватар для Vinemax
149 / 117 / 10
Регистрация: 12.09.2011
Сообщений: 785

Перевод из XML в Access

22.12.2013, 16:40. Показов 3870. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем!

Подскажите, пожалуйста, возможно ли как-то таблицу, сохраненную в XML-формате, быстро перевести в такую же таблицу Access, т.е. как бы конвертировать XML в MDB?

Сейчас я это делаю через OleDb путем считывания xml-тэгов и записи их значений в предварительно созданную таблицу Access (INSERT INTO...). Так как записей (строк) в таблице более ста тысяч, естественно, это вся эта процедура перегонки занимает много времени.

Можно ли как-то быстро это сделать?

Спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.12.2013, 16:40
Ответы с готовыми решениями:

Перевод текста в XML
Всем доброго дня! Как-то внезапно возникло несколько вопросов. 1. Есть текст, обычной исходный код С++ в *.cpp файле. Как мне его...

перевод из xml в html
Всем привет, у меня возникла проблемма: есть файл xml вида <students> <student id="1" name="Иван"...

Access and XML
Вопрос. Можно сделать чтобы отчёт из базы выходил в формате XML

16
 Аватар для dimsaratov
356 / 295 / 78
Регистрация: 02.10.2013
Сообщений: 476
Записей в блоге: 5
22.12.2013, 18:50
Можно так
VB.NET
1
2
3
Dim FilePathString As String
Dim tblDataTable As New DataTable
tblDataTable.ReadXml(FilePathString)
1
 Аватар для Vinemax
149 / 117 / 10
Регистрация: 12.09.2011
Сообщений: 785
23.12.2013, 05:54  [ТС]
dimsaratov, так а как потом эту DataTable в Access-формат сохранить? Суть в том, что медленно у меня не считывание тэгов происходит, а именно INSERT через OleDb, потому как таким образом можно только по одной строке добавлять, OleDb не позволяет в одном запросе несколько команд использовать - только по одной на запрос.
0
 Аватар для Серж_87
1303 / 509 / 63
Регистрация: 09.08.2012
Сообщений: 2,056
23.12.2013, 18:13
Я с HML форматом никогда не работал, но те же 100 тыс строк экселя не так уж долго импортировать в таблицу аксес. Можно и несколько миллионов строк за 5-10 мин импортировать. Думаю с hml примерно аналогично все

Эксель импортировать так (в аксе):
SQL
1
2
INSERT INTO Таблица
SELECT * FROM [Лист1$] IN 'c:айл.xls'[Excel 8.0; HDR=NO;]
Для чего это делать именно в VB ? Чем аксес не устраивает?
А вообще можно в VB создать файл mdb с таблицой (в книжке Лукина это есть) и заполнить ее из DataTable.
0
 Аватар для dimsaratov
356 / 295 / 78
Регистрация: 02.10.2013
Сообщений: 476
Записей в блоге: 5
23.12.2013, 19:54
VB.NET
1
2
3
4
5
6
Dim iReader1 As IDataReader = tblDataTable.CreateDataReader
Dim tblAccess As DataTable
Dim dAdapter As New OleDbDataAdapter 'Для записи в Access нужно корректно определить InsertCommand
dAdapter.fill(tblAccess)
tblAcesse.Load(iReader1)
dAdapter.update(tblAccess)
1
Заблокирован
24.12.2013, 04:13
а как потом эту DataTable в Access-формат
Используйте ADOX, с его помощью можно и создать, и заполнить БД.
Хотя я предпочитаю создавать ADOX'ом, а заполнять - как обычно, через ADO.NET (System.Data.OleDb).

ПРОЕКТ -> Добавить ссылку -> COM -> Microsoft ADO Ex ****
Далее гугл в помощь.
1
 Аватар для Vinemax
149 / 117 / 10
Регистрация: 12.09.2011
Сообщений: 785
24.12.2013, 13:46  [ТС]
Цитата Сообщение от emenem97 Посмотреть сообщение
Я с HML форматом никогда не работал, но те же 100 тыс строк экселя не так уж долго импортировать в таблицу аксес. Можно и несколько миллионов строк за 5-10 мин импортировать. Думаю с hml примерно аналогично все

Эксель импортировать так (в аксе):
SQL
1
2
INSERT INTO Таблица
SELECT * FROM [Лист1$] IN 'c:айл.xls'[Excel 8.0; HDR=NO;]
Для чего это делать именно в VB ? Чем аксес не устраивает?
А вообще можно в VB создать файл mdb с таблицой (в книжке Лукина это есть) и заполнить ее из DataTable.
так, я же так и делаю, только OleDb позволяет по одной строчке вгонять в таблицу, а мне нужно именно быстро. Нужно именно VB .NET, потому как программа написана на нем и одна из ее функций это забирать с сервера списки товаров. С web-программистом на стороне заказчика решили, что отдается в xml-формате. Первая версия программы полностью загружала 100-мегабайтный xml-файл в DataSet, на сильных компьютерах это не беда, а вот на нетбуках, которыми пользуются их торговые представители, тормозило страшно. Всё это я ускорил, но только через Access-формат запросами, и вот именно перегонка таблицы в mdb-файл занимает много времени - около четырех минут
0
Заблокирован
24.12.2013, 14:39
и вот именно перегонка таблицы в mdb-файл занимает много времени - около четырех минут
Можно попробовать разобраться в бинарной структуре файла mdb и работать с ним как с бинарным файлом. Так делает Access.
Вот здесь посмотрите, может пригодится. http://mdbtools.sourceforge.net/faq.html
На том же сайте вроде и библиотека какая-то есть, не знаю, платная или бесплатная.

Кстати, а формат accdb не подошёл бы?
Может там ZIP-архив с XML'ем, как, например, в docx и xlsx? Тогда там должно быть легче.
1
 Аватар для Vinemax
149 / 117 / 10
Регистрация: 12.09.2011
Сообщений: 785
25.12.2013, 09:32  [ТС]
В принципе, мне любой Access-формат подошел бы... При создании подключения к базе у меня через Try - Catch идет три попытки, одна из которых срабатывает - сначала пытается через JET подключиться, потом через ACE 12 и через ACE 14 (это именно для acdb-форматов)

Добавлено через 17 часов 23 минуты
Цитата Сообщение от dimsaratov Посмотреть сообщение
VB.NET
1
2
3
4
5
6
Dim iReader1 As IDataReader = tblDataTable.CreateDataReader
Dim tblAccess As DataTable
Dim dAdapter As New OleDbDataAdapter 'Для записи в Access нужно корректно определить InsertCommand
dAdapter.fill(tblAccess)
tblAcesse.Load(iReader1)
dAdapter.update(tblAccess)
dimsaratov, я не совсем пойму этот код. Насколько я понял, таблица tblAccess должна быть заведомо подключена к базе Access, так? Дело в том, что, например, чтобы считать всю таблицу из Access в DataTable, делаю типичный запрос SELECT * FROM tblPrice (так таблица в Access у меня называется), а вот сейчас мне нужно тоже самое, только обратно в Access из моей DataTable загнать. Как писал, сейчас делаю это по одной строчке... Не мог бы ты подробнее мне объяснить хотя бы суть? )) Гугл не помогает...
0
 Аватар для dimsaratov
356 / 295 / 78
Регистрация: 02.10.2013
Сообщений: 476
Записей в блоге: 5
25.12.2013, 20:10
Это был пример подразумевалось что код конфигурирования DataAdapter не представляет сложности

Пример такого кода
VB.NET
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
Dim param As OleDbParameter
' определяем код для выборки из БД
dAdapter.SelectCommand = New OleDbCommand("SELECT unique_id, name, description FROM tblSet", cnnRW) 
 
' определяем код для обновления
dAdapter.UpdateCommand = New OleDbCommand("Update tblSet Set unique_id=@unique_id, name=@name, " & _ "description=@description WHERE unique_id=@unique_id", cnnRW)
 
        param = dAdapter.UpdateCommand.Parameters.Add(New OleDbParameter("@unique_id", OleDbType.Integer))
        param.Direction = ParameterDirection.Input
        param.SourceColumn = "unique_id"
' определяющий параметр какую версию записи сохранять в данном случае оригинальную без изменений
        param.SourceVersion = DataRowVersion.Original 
 
        param = dAdapter.UpdateCommand.Parameters.Add(New OleDbParameter("@name", OleDbType.VarChar, 255))
        param.Direction = ParameterDirection.Input
        param.SourceColumn = "name"
        param.SourceVersion = DataRowVersion.Current
 
        param = dAdapter.UpdateCommand.Parameters.Add(New OleDbParameter("@description", OleDbType.VarChar, 255))
        param.Direction = ParameterDirection.Input
        param.SourceColumn = "description"
        param.SourceVersion = DataRowVersion.Current
 
' определяем код для вставки новых строк
dAdapter.InsertCommand = New OleDbCommand("INSERT INTO tblSet (unique_id, name, description) " & _
"VALUES (@unique_id, @name, @description)", cnnRW)
 
        param = dAdapter.UpdateCommand.Parameters.Add(New OleDbParameter("@unique_id", OleDbType.Integer))
        param.Direction = ParameterDirection.Input
        param.SourceColumn = "unique_id"
 ' определяющий параметр какую версию записи сохранять
        param.SourceVersion = DataRowVersion.Current
 
        param = dAdapter.UpdateCommand.Parameters.Add(New OleDbParameter("@name", OleDbType.VarChar, 255))
        param.Direction = ParameterDirection.Input
        param.SourceColumn = "name"
        param.SourceVersion = DataRowVersion.Current
 
        param = dAdapter.UpdateCommand.Parameters.Add(New OleDbParameter("@description", OleDbType.VarChar, 255))
        param.Direction = ParameterDirection.Input
        param.SourceColumn = "description"
        param.SourceVersion = DataRowVersion.Current
' определяем код для удаления из базы данных из БД
 dAdapter.DeleteCommand = New OleDbCommand("DELETE FROM tblSet WHERE unique_id=@unique_id", cnnRW)
строка
VB.NET
1
dAdapter.fill(tblAccess)
нужна для того чтобы получить структуру таблицы в база данных Access и процесс загрузки прошел без проблем, причем структура tblAccess должна быть такой же как структура файла XML
1
 Аватар для Vinemax
149 / 117 / 10
Регистрация: 12.09.2011
Сообщений: 785
26.12.2013, 13:09  [ТС]
dimsaratov, разобрался по твоему примеру и таким образом чудесно при Update добавляются строки, но вот при обновлении выдает "Нарушение параллелизма: UpdateCommand затронула 0 из ожидаемых 1 записей"... Уже несколько часов гуглю, ничего не могу найти. Почему не происходит обновление записи, не подскажешь?
0
 Аватар для dimsaratov
356 / 295 / 78
Регистрация: 02.10.2013
Сообщений: 476
Записей в блоге: 5
26.12.2013, 19:15
у тебя где то в программе нарушение логики
обычно такое сообщение происходит когда:
- добавили новую строку статус стал Added
- после этого изменили эту строку статус стал Changed
- далее при попытке выполнить команду Update происходит попытка обновить строку отсутствующую в БД

либо второй вариант где то ошибка в строке комманды UpdateCommand.CommandText

если в логике ошибки нет выкладывай код конфигурирования датаадаптера
1
 Аватар для Vinemax
149 / 117 / 10
Регистрация: 12.09.2011
Сообщений: 785
27.12.2013, 10:37  [ТС]
Адаптер я конфигурирую так (connection это заведомо созданное и открытое подключение к базе):

VB.NET
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
59
60
61
62
63
64
65
66
67
    Private Function MakeAdapter() As OleDbDataAdapter
 
        Dim adapter As New OleDbDataAdapter
 
 
        With adapter
 
            .SelectCommand = New OleDbCommand("SELECT * FROM tblPrice", connection)
 
 
            .InsertCommand = New OleDbCommand("INSERT INTO tblPrice (id,id_category,name,description,weight,volume,contain,unit,matrix,present,amount,price,orderAmount,distributor) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)", connection)
 
            With .InsertCommand.Parameters
 
                .Add("id", OleDbType.VarWChar).SourceColumn = "ID"
                .Add("id_category", OleDbType.VarWChar).SourceColumn = "ID_category"
                .Add("name", OleDbType.VarWChar).SourceColumn = "name"
                .Add("description", OleDbType.VarWChar).SourceColumn = "description"
                .Add("weight", OleDbType.VarWChar).SourceColumn = "weight"
                .Add("volume", OleDbType.VarWChar).SourceColumn = "volume"
                .Add("contain", OleDbType.VarWChar).SourceColumn = "contain"
                .Add("unit", OleDbType.VarWChar).SourceColumn = "unit"
                .Add("matrix", OleDbType.Boolean).SourceColumn = "matrix"
                .Add("present", OleDbType.Boolean).SourceColumn = "present"
                .Add("amount", OleDbType.VarWChar).SourceColumn = "amount"
                .Add("price", OleDbType.VarWChar).SourceColumn = "price"
                .Add("orderAmount", OleDbType.VarWChar).SourceColumn = "orderAmount"
                .Add("distributor", OleDbType.VarWChar).SourceColumn = "distributor"
 
            End With
 
 
            .UpdateCommand = New OleDbCommand("UPDATE tblPrice SET id_category=?,name=?,description=?,weight=?,volume=?,contain=?,unit=?,matrix=?,present=?,amount=?,price=?,orderAmount=?,distributor=? WHERE id=?", connection)
            .UpdateCommand.UpdatedRowSource = UpdateRowSource.Both
 
            With .UpdateCommand.Parameters
 
                .Add("id", OleDbType.VarWChar).SourceColumn = "ID"
                .Add("id_category", OleDbType.VarWChar).SourceColumn = "ID_category"
                .Add("name", OleDbType.VarWChar).SourceColumn = "name"
                .Add("description", OleDbType.VarWChar).SourceColumn = "description"
                .Add("weight", OleDbType.VarWChar).SourceColumn = "weight"
                .Add("volume", OleDbType.VarWChar).SourceColumn = "volume"
                .Add("contain", OleDbType.VarWChar).SourceColumn = "contain"
                .Add("unit", OleDbType.VarWChar).SourceColumn = "unit"
                .Add("matrix", OleDbType.Boolean).SourceColumn = "matrix"
                .Add("present", OleDbType.Boolean).SourceColumn = "present"
                .Add("amount", OleDbType.VarWChar).SourceColumn = "amount"
                .Add("price", OleDbType.VarWChar).SourceColumn = "price"
                .Add("orderAmount", OleDbType.VarWChar).SourceColumn = "orderAmount"
                .Add("distributor", OleDbType.VarWChar).SourceColumn = "distributor"
 
            End With
 
 
            .DeleteCommand = New OleDb.OleDbCommand("DELETE FROM tblPrice WHERE id=?", connection)
            .DeleteCommand.Parameters.Add("id", OleDb.OleDbType.VarWChar).SourceColumn = "ID"
 
 
            '.AcceptChangesDuringUpdate = True
 
        End With
 
 
        Return adapter
 
    End Function
Эта ошибка происходит, когда сначала делаю adapter.Fill - заполняю DataTable данными из базы, потом в первую строчку поля name просто заношу значение от фонаря, делаю adapter.Update и... ошибка! AcceptChanges в разных местах (и после Fill, и после изменения значения) не помогает
1
 Аватар для dimsaratov
356 / 295 / 78
Регистрация: 02.10.2013
Сообщений: 476
Записей в блоге: 5
27.12.2013, 22:18
после команды acceptchanges(принять все изменения) адаптер считает что ВСЕ записи обновлены и обновлять их не нужно
1
 Аватар для Vinemax
149 / 117 / 10
Регистрация: 12.09.2011
Сообщений: 785
29.12.2013, 12:37  [ТС]
Цитата Сообщение от dimsaratov Посмотреть сообщение
после команды acceptchanges(принять все изменения) адаптер считает что ВСЕ записи обновлены и обновлять их не нужно
ну, я так и понял. просто, получается, что при Update пустой таблицы срабатывает INSERT и в нее успешно добавляются записи, а вот когда после заполнения таблицы меняю значение и опять делаю Update, выдает вот такую ошибку параллелизма.

Так или иначе, видимо, нужно мне отказаться от этой идеи. Дело в том, что я создал подключение к моей таблице с помощью конструктора, и вот там все добавляется, обновляется нормально, но также медленно, как я и до этого делал, а делал просто путем последовательного считывания xml через XmlReader и внесения или изменения данных просто по одному запросу - та же скорость ровно. Видимо, adapter.Update делает ровно тоже самое, что и я
0
 Аватар для dimsaratov
356 / 295 / 78
Регистрация: 02.10.2013
Сообщений: 476
Записей в блоге: 5
29.12.2013, 13:05
у меня подобная конструкция загружает в access таблицу 12000 строк х 49 столбцов за 1,5-2 сек.
в любом случае обновление всей таблицы происходит быстрее чем обновление. таблицы по одной записи
1
 Аватар для Vinemax
149 / 117 / 10
Регистрация: 12.09.2011
Сообщений: 785
30.12.2013, 16:09  [ТС]
dimsaratov, интересно! На процедуру перевода моих данных (примерно 72000 строк и 14 колонок) в MDB-формат уходит 4 минуты моим способом - по одному запросу на строку, и почти столько же времени уходит, когда через конструктор подключена таблица: сначала делаю ReadXml, потом adapter.Update... и уходит столько же времени... Меряю не на глаз, а фиксирую Now в переменной в самом начале, потом показываю разницу с Now в конце - около 4-х минут получается. Время-то конечно небольшое, но у меня Core I3, а у торговых представителей заказчика - нетбуки и даже планшеты, короче, у них чуть ли не по полчаса уходит на обновление всех товаров.

Может быть Update одной командой выполняется у меня так же долго, из-за того, что два поля в таблице имеют тип Memo ? Или всё-таки что-то я не так делаю... Ок, буду еще пробовать.

Спасибо, в любом случае!

Добавлено через 15 минут
Кстати, если кому интересно, вот что я делаю чтобы MDB-база не "распухала", ведь удаленные строки фактически не удаляются, а помечаются как удаленные:

VB.NET
1
2
3
4
5
6
7
8
9
    Public Sub CompressDatabase()
 
        Dim jro As New JRO.JetEngine : File.Delete(fileGoodsTemp)
 
        jro.CompactDatabase("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & AppData & "Goods.mdb", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & fileGoodsTemp & ";Jet OLEDB:Engine Type=5")
 
        File.Copy(fileGoodsTemp, AppData & "Goods.mdb", True)
 
    End Sub
...где fileGoodsTemp - путь к любому временному файлу, AppData - пут к папке Application Data, ну а Goods.mdb - сама база Access (любая). В самом же проекте в ссылках нужно добавить два COM-объекта Microsoft ActiveX Data Objects Library и Microsoft Jet and Replication Objects Library
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.12.2013, 16:09
Помогаю со студенческими работами здесь

XML + Access
Вообщем две бд, в акссесе хранятся некоторые поля, в xml хранятся теже поля + описание и фото, как сделать чтобы записи в каждой бд были...

Перевод текстового файла в XML формат
Здравствуйте, мне необходимо написать программу, которая получая на входе текстовый файл будет выдавать соответствующий ему файл xml. ...

Перевод файла формата txt в xml
Честно сразу скажу, что ни разу с xml до этого не сталкивалась. И во сейчас для загрузки в программу Документы ПУ 5 необходимо все...

Экспорт из access в xml
Всем привет. Помогите разобраться. каким образом можно (программно) экспортировать часть данных из таблицы в xml. При это должны...

Экспорт XML в Access
Есть таблица XML, нужно ее передать в ACCESS (к примеру). Почему то во всех примерах XML передают в МЕМО, а мне нужно отобразить содержимое...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru