Экспорт/импорт XML. Часть 2. Средства ADO
1 Средства библиотеки ADO
Для экспорта или импорта можно воспользоваться возможностями библиотеки ADO. Чтобы воспользоваться этими возможностями сполна придется написать немного кода.
2 Экспорт в файл
Для экспорта данных испльзуется метод:
recordset.Save Destination, PersistFormat
Destination – имя файла или объект типа Stream.
PersistFormat – формат вывода.
Параметр PersistFormat в нашем случае всегда будет равен adPersistXML. Параметр Destination открывает простор для творчесва, подробнее в примерах. Рассмотрим пример:
Public Function SaveRstToXml(ByRef rst As ADODB.Recordset _
, ByVal stFileName As String)
'-- сохранить xml файл в Recordset
If Dir(stFileName) <> "" Then
Kill stFileName
End If
rst.Save stFileName, adPersistXML
End Function
В метод Save мы передали путь с именем файла. Перед тем как сохранить файл необходимо убедиться, что похожего файла нет или удалить его (стр. 9). Иначе произойдет ошибка выполнения. В результате получим xml файл такой же структуры, как и при использовании средств MS Access.
В документации указанно, что данные сохраняются в кодировке UTF-8. И в загловке файла нет привычного для XML заголовка, похожего на:<?xml version="1.0" encoding ="windows-1251"?>. Чтобы сохранить данные любой в другой кодировке можно восользоваться объектом ADO.Stream.
Смотрим:
Public Function SaveRstToXml2(ByRef rst As ADODB.Recordset _
, ByVal stFileName As String)
'-- сохранить xml файл в Recordset
Dim sm As ADODB.Stream
Set sm = New ADODB.Stream
sm.Charset = "KOI8-R" '-- любимая кодировка
rst.Save sm, adPersistXML '-- сохраняем в поток
If Dir(stFileName) <> "" Then
Kill stFileName
End If
sm.SaveToFile stFileName '-- сохраняем поток в файл
sm.Close
End Function
Обратите внимение, что тут в метод Save передан объект Stream.
Функции SaveRstToXml и SaveRstToXml2 являются библиотечными. При рельном использовании в них необходимо добавить обработку ошибок. Я не стал этого делать, чтобы не увеличивать код. Для удобства использования написана специализированая функция:
Public Function EportTblToXml(ByVal imTblFrom As String _
, ByVal imFileTo As String)
'-- экспортировать таблицу в xml файл
Dim rstData As ADODB.Recordset
Dim cnn As ADODB.Connection
Set cnn = CurrentProject.Connection
Set rstData = New ADODB.Recordset
rstData.Open "SELECT * FROM " & imTblFrom, cnn _
, adOpenKeyset, adLockOptimistic
Call SaveRstToXml(rstData, imFileTo)
rstData.Close
End Function
Ее задача подготовить данные для библиотечной фукнции. Таблица открывается в текущей базе данных. При изменении требований, именно эту фукнцию можно спокойно менять, например, добавить соединение с базой или фильтр экспортируемых данных.
3 Импорт из файла
Для экспорта данных испльзуется метод:
recordset.Open
Source – источник: SQL запрос, имя файла, объект Stream и п.р.
ActiveConnection – соединение.
CursorType – тип курсора.
LockType – тип блокировки.
Options – дополнительные опции.
Имя файла указывается на месте первого праметра Source. Если опустить все остальные параметры, то в результате откроется последовательный набор в режиме только для чтения. Быстро — то что нужно для импорта. Если нужно редактировать, то придется поиграть с параметрами CursorType и LockType.
Рассмотрим пример:
Public Function LoadXmlToRst(ByVal stFileName As String) As ADODB.Recordset '-- загрузить в Recordset из xml файла Dim rst As ADODB.Recordset Set rst = New ADODB.Recordset rst.Open stFileName '-- открыть файл Set LoadXmlToRst = rst End Function
Как оказывается все просто. Для надежного использования не хватает проверки наличия файла или обработки ошибок.
Также рассмотрим пример при чтении из потока с изменением кодировки:
Public Function LoadXmlToRst2(ByVal stFileName As String) As ADODB.Recordset '-- загрузить в Recordset из xml файла Dim sm As ADODB.Stream Dim rst As ADODB.Recordset Set sm = New ADODB.Stream sm.Charset = "KOI8-R" '-- любимая кодировка sm.Open sm.LoadFromFile stFileName '-- загружаем файл в поток Set rst = New ADODB.Recordset rst.Open sm '-- загружаем Recordset из потока sm.Close Set LoadXmlToRst2 = rst End Function
Как и с экспортом написана специализированая функция ImportXmlToTbl. После открытия импортируемого файла в виде объекта Recordset импорт только начинается. Теперь данные необходимо обработать и поместить в базу. В примере все просто – данные добавляются без обарботки, но перед добавлением таблицу небоходимо очистить. Это происходит перед вызовом этой фукции.
Пример:
Public Function ImportXmlToTbl(ByVal imFileFrom As String _
, ByVal imTblTo As String)
'-- импортировать xml файл в БД
Dim rstData As ADODB.Recordset
Dim rstTo As ADODB.Recordset
Dim fld As ADODB.Field
Dim cnn As ADODB.Connection
Set cnn = CurrentProject.Connection
Set rstTo = New ADODB.Recordset
rstTo.Open "SELECT * FROM " & imTblTo, cnn _
, adOpenKeyset, adLockOptimistic
Set rstData = LoadXmlToRst(imFileFrom) '-- добавляем данные из xml в таблицу
'-- тут может происходить обновление данных
'-- или любая другая обработка
Do While Not rstData.EOF
rstTo.AddNew
For Each fld In rstData.Fields
rstTo(fld.Name) = fld.Value
Next fld
rstTo.Update
rstData.MoveNext
Loop
rstData.Close
rstTo.Update
rstTo.Close
End Function
4 Итог
Данный метод хорошо тем, что позволяет с минимальными усилиями экспортировать и импортировть таблицы максимально гибко. Не так много кода нужно будет написать, чтобы экспортировать данные из стороннего mdb файла.
Недостатки не очень серьезные: структуру результирующего файла определяет сама библиотека ADO; нет возможности экспортировать данные в иеррахическом ввиде.
Подробности в примере.
Продолжение следует. В нем рассмотрим свой генератор XML.
Использованная литература: встроенная справка.
(с) Скоков Сергей
Поэт может вынести все, кроме опечатки.
Beyonce
29 Май 08 at 13:54
Было бы интересно узнать поподробнее
Виктор
30 Июн 08 at 14:10
пасибо за инфо давно ищу такое
Роман
9 Июл 08 at 03:39
Непонятно, зачем делать функцию public??
Dim
11 Июл 08 at 05:03
Какую функцию?
admin
11 Июл 08 at 14:17
Здорово, тоже хотелось бы писать на эту тему, жаль литературного дара нет
Pally
11 Июл 08 at 18:16
Интересно, продолжение будет?
Лира Власова
11 Июл 08 at 19:10
Автор а ты журналист?
Лорд
11 Июл 08 at 20:28
полностью поддерживаю!
Филатов Влад
11 Июл 08 at 20:42
Слушай автор, а с тобой побазарить можно как-то?
Lord
11 Июл 08 at 22:29
Впервые слышу, я в шоке
joker
11 Июл 08 at 22:41
Продолжение будет. На этих выходных или на след неделе.
Чтобы побазарить см. страницу Написать. Нам можно указать свой ICQ или Skype.
Я программист. А потом уже все остальное.
admin
12 Июл 08 at 00:11
А моё мнение вас интересует?
Валоха Борода
12 Июл 08 at 17:29
в общем поддерживаю, но есть моменты которые стоит обсудить подробнее
Комолов Саша
12 Июл 08 at 18:15
спасибки
Kvent_fun
12 Июл 08 at 20:56
Давайте остановимся на этом поподробнее!
Pally
12 Июл 08 at 22:37
Интересует мнение каждого.
admin
12 Июл 08 at 23:55
Что же теперь делать? Это перевернуло моё мировозрение
Флинт Яков
12 Июл 08 at 23:59
Помоему здорово, а можно вашу аську, обсудить тему хотелось бы.
Rimma
13 Июл 08 at 03:53
Обеденное чтиво! Пишите ещё!
Довыдов
13 Июл 08 at 11:22
согласна с автором
Линда
13 Июл 08 at 11:29
А есть кто-то кто не согласен с автором?
Сеня
13 Июл 08 at 12:19
«мистика» да и только…
Артур Бронин
13 Июл 08 at 16:20
Rimma, отправил номер icq вам на почту.
admin
13 Июл 08 at 22:42
вызов open с recordset разве принимает параметры?
beatseed
19 Авг 08 at 10:07
Огромное спасибо автору, за невероятно полезную и познавательную информацию! Занес ваш сайт к себе в букмарки!
Evraziatur
9 Мар 09 at 23:55