Начнем мы с того, что скопируем данные записной книжки из XML-файла book.xml в DBF-таблицу Phone.dbf (сценарий InsertRecords.js). Все остальные сценарии, которые рассматриваются в этой главе, будут работать уже с этой таблицей.
Копирование данных из XML-файла в таблицу БД
Напишем сценарий InsertRecords.js, который будет извлекать данные из XML-файла book.xml и добавлять записи с этими данными в таблицу Phone.dbf, для доступа к которой мы предварительно создали DSN (рис. 9.9).
Сценарий InsertRecords.js будет состоять из нескольких функций, главной из которых является Main()
. В этой функции сначала создается объект WshShell
и определяется путь к XML-файлу, который должен находиться в текущем каталоге:
//Создаем объект WshShell
WshShell = WScript.CreateObject('WScript.Shell');
//Путь к XML-файлу с данными
PathBook=WshShell.CurrentDirectory+'\book.xml';
Для доступа к таблице Phone мы создаем объект Connection
, который позволяет с помощью метода Open()
устанавливать связь с заданной базой данных. Для этого необходимо в качестве параметра Open()
указать строку с именем источника данных, к которому происходит обращение (в нашем случае эта строка имеет вид 'DSN=PhoneDS'):
//Создаем объект Connection
Connect=WScript.CreateObject('ADODB.Connection');
//Формируем строку с параметрами соединения с БД
//(указываем нужный DSN)
SConnect='DSN=PhoneDS';
//Устанавливаем связь с БД
Connect.Open(SConnect);
После этого происходит вызов функции XMLToBase()
, в которой происходит разбор XML-файла с помощью объектной модели XML DOM (применение XML DOM было подробно описано в
//Копирование данных из XML-файла в таблицу Phone
function XMLToBase() {
var XML,Root,NomRec,CurrNode,i;
//Создаем объект XML DOM
XML = WScript.CreateObject('Msxml.DOMDocument');
//Загружаем XML-документ из файла
XML.load(PathBook);
//Сохраняем в переменной Root ссылку на корневой элемент документа
Root=XML.documentElement;
//Перебираем все дочерние элементы первого уровня вложенности
//для корневого элемента
for (i=1; i<=Root.childNodes.length-1;i++) {
//Выделяем в коллекции XML-элементов i-й элемент
CurrNode=Root.childNodes.item(i);
//Вставляем новую запись в таблицу Phone
PersonToTable(CurrNode);
}
}
Как мы видим, в функции XMLToBase()
определяется цикл for
, в котором для каждого XML-элемента, содержащего данные об одном человеке, происходит вызов функции PersonToTable(
. В функции PersonToTable (
формируется SQL-запрос INSERT INTO Phone…
, который позволяет вставить в таблицу Phone новую запись с заданными значениями полей, например:
INSERT INTO Phone (LastName, Name, Phone, Street, House, App, Notes)
VALUES ('Иванов', 'Иван', '17-17-17', 'Садовая', '4', '6', 'Очень хороший человек')
Строится строка с SQL-запросом (переменная SSQL) следующим образом:
//Строим список значений полей добавляемой записи
SSQL+='''+GetTagVal(XNode, 'LastName')+'',';
SSQL+='''+GetTagVal(XNode, 'Name')+'',';
SSQL+='''+GetTagVal(XNode, 'Phone')+'',';
SSQL+='''+GetTagVal(XNode, 'Street')+'',';
SSQL+='''+GetTagVal(XNode, 'House')+'',';
SSQL+='''+GetTagVal(XNode, 'App')+'',';
SSQL+='''+GetTagVal(XNode, 'Note')+''';
//Формируем текст SQL-запроса для вставки записи
SSQL='INSERT INTO Phone (LastName, Name, Phone, Street, House, App, Notes) VALUES ('+SSQL+')';
После формирования переменной SSQL происходит вызов SQL-запроса с помощью метода Execute()
объекта Connection
:
//Выполняем подготовленный SQL-запрос (добавляем запись в таблицу)
Connect.Execute(SSQL);
После окончания копирования данных в функции Main()
выводится соответствующее сообщение:
//Выводим сообщение об окончании переноса данных
WshShell.Popup('Данные из XML-файла в таблицу перенесены!', 0, 'Работа с базой данных', vbInformation+vbOkOnly);
Полностью текст сценария InsertRecords.js приведен в листинге 9.1.
/*******************************************************************/
/* Имя: InsertRecords.js */
/* Язык: JScript */
/* Описание: Копирование данных из XML-файла таблицу базы */
/* данных */
/*******************************************************************/
//Объявляем переменные
var
WshShell, //Экземпляр объекта WshShell
BasePath, //Путь к текущему каталогу
PathBook, //Путь к файлу с данными
NomRec=0, //Счетчик количества записей
SConnect, //Строка с параметрами соединения с БД
Connect; //Экземпляр объекта Connection
//Инициализируем константы для диалоговых окон
var vbInformation=64,vbOkOnly=0;
//Определение значения тега tgName XML-элемента obj
function GetTagVal(obj, tgName) {