5 строк кода

Как писать приложения на MS Access

Экспорт/импорт XML. Часть 2. Средства ADO

26 комментариев

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.

Использованная литература: встроенная справка.

(с) Скоков Сергей

Written by Сергей Скоков

Декабрь 27th, 2007 at 6:06 пп

Posted in xml

26 комментариев to 'Экспорт/импорт XML. Часть 2. Средства ADO'

Subscribe to comments with RSS or TrackBack to 'Экспорт/импорт XML. Часть 2. Средства ADO'.

  1. Поэт может вынести все, кроме опечатки.

    Beyonce

    29 мая 08 at 13:54

  2. Было бы интересно узнать поподробнее

    Виктор

    30 Июн 08 at 14:10

  3. пасибо за инфо давно ищу такое

    Роман

    9 Июл 08 at 03:39

  4. Непонятно, зачем делать функцию public??

    Dim

    11 Июл 08 at 05:03

  5. Какую функцию?

    admin

    11 Июл 08 at 14:17

  6. Здорово, тоже хотелось бы писать на эту тему, жаль литературного дара нет 🙂

    Pally

    11 Июл 08 at 18:16

  7. Интересно, продолжение будет?

    Лира Власова

    11 Июл 08 at 19:10

  8. Автор а ты журналист?

    Лорд

    11 Июл 08 at 20:28

  9. полностью поддерживаю!

    Филатов Влад

    11 Июл 08 at 20:42

  10. Слушай автор, а с тобой побазарить можно как-то?

    Lord

    11 Июл 08 at 22:29

  11. Впервые слышу, я в шоке 🙂

    joker

    11 Июл 08 at 22:41

  12. Продолжение будет. На этих выходных или на след неделе.

    Чтобы побазарить см. страницу Написать. Нам можно указать свой ICQ или Skype.

    Я программист. А потом уже все остальное.

    admin

    12 Июл 08 at 00:11

  13. А моё мнение вас интересует?

  14. в общем поддерживаю, но есть моменты которые стоит обсудить подробнее

    Комолов Саша

    12 Июл 08 at 18:15

  15. спасибки

    Kvent_fun

    12 Июл 08 at 20:56

  16. Давайте остановимся на этом поподробнее!

    Pally

    12 Июл 08 at 22:37

  17. Интересует мнение каждого.

    admin

    12 Июл 08 at 23:55

  18. Что же теперь делать? Это перевернуло моё мировозрение 😀

    Флинт Яков

    12 Июл 08 at 23:59

  19. Помоему здорово, а можно вашу аську, обсудить тему хотелось бы.

    Rimma

    13 Июл 08 at 03:53

  20. Обеденное чтиво! Пишите ещё!

    Довыдов

    13 Июл 08 at 11:22

  21. согласна с автором

    Линда

    13 Июл 08 at 11:29

  22. А есть кто-то кто не согласен с автором?

    Сеня

    13 Июл 08 at 12:19

  23. «мистика» да и только…

    Артур Бронин

    13 Июл 08 at 16:20

  24. Rimma, отправил номер icq вам на почту.

    admin

    13 Июл 08 at 22:42

  25. вызов open с recordset разве принимает параметры?

    beatseed

    19 Авг 08 at 10:07

  26. Огромное спасибо автору, за невероятно полезную и познавательную информацию! Занес ваш сайт к себе в букмарки!

    Evraziatur

    9 Мар 09 at 23:55

Leave a Reply