Книга: Windows Script Host для Windows 2000/XP

Копирование данных из XML-файла в таблицу БД

Копирование данных из 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 было подробно описано в главе 7).

//Копирование данных из 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(XNode). В функции PersonToTable(XNode) формируется 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.

Листинг 9.1. Копирование данных из XML-файла в таблицу БД

/*******************************************************************/
/* Имя: 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) {
 var ElemList;
 //Создаем коллекцию дочерних для obj элементов, которые
 //задаются тегом tgName
 ElemList=obj.getElementsByTagName(tgName);
 //Проверяем, есть ли в коллекции ElemList элементы
 if (ElemList.length>0)
  //Возвращаем значение тега tgName
  return ElemList.item(0).text
 else return "";
}
//Вставка в таблицу одной записи
function PersonToTable(XNode) {
 var SSQL="";  //Переменная для формирования текста SQL-запроса
 //Строим список значений полей добавляемой записи
 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+")";
 //Выполняем подготовленный SQL-запрос (добавляем запись в таблицу)
 Connect.Execute(SSQL);
}
//Копирование данных из 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);
 }
}
//Основная запускная функция
function Main() {
 //Создаем объект WshShell
 WshShell = WScript.CreateObject("WScript.Shell");
 //Путь к XML-файлу с данными
 PathBook=WshShell.CurrentDirectory+"book.xml";
 //Создаем объект Connection
 Connect=WScript.CreateObject("ADODB.Connection");
 //Формируем строку с параметрами соединения с БД
 //(указываем нужный DSN)
 SConnect="DSN=PhoneDS";
 //Устанавливаем связь с БД
 Connect.Open(SConnect);
 //Копируем данные из XML-файла в таблицу БД
 XMLToBase();
 //Выводим сообщение об окончании переноса данных
 WshShell.Popup("Данные из XML-файла в таблицу перенесены!", 0,
  "Работа с базой данных",vbInformation+vbOkOnly);
}
/*******************  Начало  **********************************/
Main();
/*************  Конец *********************************************/

Оглавление книги


Генерация: 1.125. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз