DataSet (Набор данных) и XML
Для иллюстрации связи между реляционной
моделью объекта DataSet (Набор данных) и
моделью ХМ L прежде всего извлечем
некоторую информацию из базы данных. В
примере DataSetXml для этого используются те же
команды и способы, что и ранее в этой главе.
Первым делом создадим соединение, набор данных и преобразователь данных для
различных таблиц.
SqlConnect]on *conn =
new SqlConnect K>n ( connectStr ing) ;
DatdSet *d - new Pdtr.Set ( "Ад r±ineBroker") ; // новый
Набор данных SqlDjtaAd.-pter "air ] i -n^s Adaptcr =
new Sq]DataAoar te L ; SqiDctaAaapter * f 1 ^qn4- sAdapter -
new SqlLataAdapter; SqlDataAdapter ^plar.etypeAdapter =
new SqlDdtdAdapter; SqlDataAdapter *custon,ersAdaptei =
new SqlDataAaapter; SqlDataAdapter ^reservationsAaapter -
new SqlDataAaapter;
Затем создадим несколько команд select (выбрать)
для получения данных, и, используя эти
команды, заполним набор данных данными из
таблиц.
airlinesAdapter->SelectCommand =
new SqlCommand("select * from Airlines", conn);
// "выбрать * из Авиалиний " airlinesAdapter->Fill(d,
"Airlines"); // Заполнить (d, "Авиалинии");
flightsAdapter->SelectCommand =
new SqlCommand("select * from Flights", conn);
// "выбрать * из Рейсов" flightsAdapter->Fill(d,
"Flights"); // Заполнить (d, "Рейсы");
planetypeAdapter->SelectCommand =
new SqlCommand("select * from PlaneType", conn); //
выбрать planetypeAdapter->Fill(d, "PlaneType"); // Заполнить
customersAdapter->SelectCommand =
new SqlCommand("select * from Customers", conn);
// "выбрать * из Клиентов " customersAdapter->Fill(d,
"Customers"); // Заполнить (d, "Клиенты");
reservationsAdapter->SelectCommand =
new SqlCommand("select * from Reservations", conn);
// "выбрать * из Резервирования " reservationsAdapter->Fill(d,
"Reservations"); // Заполнить (d, "Резервирование");
Теперь в объекте DataSet (Набор данных) есть
данные таблиц Airlines (Авиалинии), PlaneType (Тип
Самолета), Flights (Рейсы), Customers (Клиенты) и
Reservations (Резервирование). Далее извлечем из
данных объекта DataSet (Набор данных) схему XML.
Затем извлечем сами данные и запишем их в
формате XML.
d->WriteXmlSchema("Airlines.xsd");
d->WriteXml("Airlines.xml");
Приведенные операторы создают два файла:
Airlines . xsd и Airlines . xml. Ниже вы видите некоторые
данные, записанные в Airlines. xml. Главным
элементом является AirlineBroker; именно так
назывался объект DataSet (Набор данных). На один
уровень ниже находятся элементы,
соответствующие разным таблицам объекта
DataSet (Набор данных): Airlines (Авиалинии), PlaneType (Тип
самолета), Flights (Рейсы) и Customers (Клиенты). О
забронированных местах информации в базе
данных не было. В получившемся документе
каждой строке исходных таблиц
соответствует одна запись. Элементы этих
записей соответствуют полям исходных
таблиц.
<?xml version="l.О" standalone="yes"?>
<AirlineBroker> <Airlines>
<Name>America West</Name>
<Abbreviation>AW</Abbreviation>
<WebSite>www.americawest.com</WebSite>
<ReservationNumber>555-555-1212</ReservationNumber>
</Airlines> <Airlines>
<Name>Delta</Name>
<Abbreviation>DL</Abbreviation>
<WebSite>www.delta.com</WebSite>
<ReservationNumber>800-456-7890</ReservationNumber>
</Airlines>
<Flights>
<Airline>DIX/Airlj.n£>
<FlightNurrber>98^</FlightNumber>
<StartCity>Atlanta</StartCity>
<EndCity>New Orleans</EndCity>
<Departure>2001-10-05T20:15:00.0000000-04:00 </Departure>
<Amval>2001-10-05T22 : 30: 00. 0000000-04 : 00</Amval>
<PlaneType>737</?ianeType>
<FirstCost>1300</FirstCost>
<BusinessCost>0</BusinessCost>
<EconoiryCost>450</EconomyCost> </Flights>
<PlaneType>
<PlaneType> 737 </PlaneType>
<FirstClass>10</FirstClass>
<BusinessClass>0</BusinessClass>
<EconomyClass>200</EconomyClass> </PlaneType->
<Customers>
<LastName>Adams</LastName> <FirstName>John</FirstName>
<EmailAddress>adams@presidents.org</EmailAddress>
<CustomerId>1</CustomerId> </Custorrers> </AirlineBroker>
Вот более русифицированная версия этого XML-документа:
<? xml версия = "1.0" автономный = "да"?>
<AirlineBroker> <Авиалинии>
<Название> Американский Запад </Название>
<Сокращение> AW </Сокращение>
<УзелИеЬ> www.americawest.com </УзелМеЬ>
<ReservationNumber> 555-5Ь5-1212 </ReservationNumber>
</Авиалинии> <Авиалинии>
<Название> Дельта </Название>
<Сокращение> DL </Сокращение>
<Узeлweb> www.delta.com </УзeлWeb>
<ReservationNumber> 800-456-7890 </ReservationNumber>
</Авиалинии> <Рейсы>
<Авиалиния> DL </Авиалиния> <FlightNumber> 987
</FlightNumber> <StartCity> Атланта </StartCity> <EndCity>
Новый Орлеан </EndCity> <Вьшет> 2001-10-05Т20:15:00.0000000-04:00
</Вылет> <Прибытие> 2001-10-05Т22:30:00.0000000-04:00
</Прибытие>
<Тип самолета> 737 </Тип самолета> <F.L-(Cust>
1300 </FirstCost> <Bus _ncssCost> 0 </BusinessCost> <EconcmyCost>
450 </EconomyCost> </Рейсь:>
<Тип самолета>
<Тип самолета>737</Тип самолета>
<FirstClass> 10 </FirstClass>
<BusinessClass> 0 </BusinessClass>
<EconomyClass> 200 </EconomyClass> </Тип самолета>
<Клиенты>
<LastName> Адаме </LastName> <FirstName> Джон
</FirstName>
<EmailAddress> adams@presidents.org </EmailAddress>
<CustomerId> 1 </CustomerId> </Клиенты> </AirlineBroker>
Исходя из этих данных, объект DataSet (Набор данных) создал схему и сохранил
ее в файле Airlines.xsd. Дальше мы обсудим некоторые отрывки из этого файла.
В нем нет информации о связях или первичных ключах какой бы то ни было таблицы,
такой, как Airlines (Авиалинии) или Flights (Рейсы), по той простой причине,
что они не были определены в исходной базе данных. Если вы просмотрите созданный
файл, вы увидите, что в нем записана и информация о схеме данных таблицы Reservations
(Резервирование), несмотря на то, что в этой таблице нет никаких данных.
В первой строке заголовка схемы
определено название схемы (AirlineBroker). Кроме
того, в нем определены два пространства
имен, используемых в этой схеме документа.
Одно пространство имен, названное xsd,
содержит описание стандарта схемы XML.
Второе, названное msdata, содержит описание от
Microsoft.
<xsd:schema id="AirlineBroker" targetNamespace=""
xmlns="" xmlns:xsd=http://www.w3.org/2001/XMLSchema xmlns:rnsdata="urn:schemas-microsoft-com:xml-msdata">
В следующей строке описывается элемент
под названием AirlineBroker, имеющий атрибут,
указывающий, что эта схема получена из
объекта DataSet (Набор данных). Это атрибут в
определениях Microsoft, а не в пространстве имен
W3C Schema. Элемент AirlineBroker относится к
составному (не скалярному) типу, т.е.
является структурой, состоящей из
элементов других типов. Такая структура
может содержать произвольное количество
элементов (или не содержать ни одного)
любого типа, определенного в остальной
части схемы.
<xsd:element name="AirlineBroker" msdata:IsDataSet="true">
<xsd:complexType> <xsd:choice maxOccurs="unbounded">
Далее описывается элемент, определяющий тип данных. Этот тип — тоже структура
и потому относится к составному (не скалярному) типу, очередность элементов
в котором совпадает с очередностью их определения в объекте DataSet (Набор данных).
Так уж получилось, что все элементы, соответствующие столбцам таблицы базы данных,
определены здесь как имеющие строковый тип string, причем их напичие не считается
обязательным. В исходной таблице первичные ключи не определялись, а так как
все эти строки в записях базы данных обязательны, объект DataSet (Набор данных)
при преобразовании данных вывел и\ из набора таблиц, ограничений и связей, определенных
в объекте DataSet (Набор данных) в момент преобразования.
<xsd : element r.ame = "Airlines"> <xsd:conplexType>
<xsd:sequence>
<xsd: element narre = "Kame" type="xsd:string"
minOccurs="0" /> <xsd: element narr:e="Abbreviation"
type="xsd:string" minOccurs="0" /> <xsd:element
name="KebSite" rype="xsd:string"
minOccurs="0" /> <xsd:element name="ReservationNumber"
type="xsd:string" minOccurs="0" /> </xsd:sequence>
</xsd:complexType> </xsd:element>
Таблица Flights (Рейсы) определена
аналогичным образом. Кроме того, что в ней
не определен первичный ключ, в ней нет и
внешних ключей для столбцов Airline (Авиалиния)
и Plane Type (Тип самолета).
<xsd: element na.me = "Fliqhts"> <xsd:complexType>
<xsd:sequence>
<xsd:element name="Airline" type="xsd:string"
minOccurs="0" /> <xsd:element name="FlightNumber"
type="xsd:int"
rainOccurs="0" /> <xsd:element name="StartCity"
type="xsd:string"
minOccurs="0" /> <xsd:element name="EndCity"
type="xsd:string"
minOccurs="C" /> <xsd:element name="Derarture"
type="xsd:dateTime"
minOccurs="0" />
<xsd:element name="Arrival" type="xsd:dateTime"
minOccurs="0" />
<xsd:element name="PlaneType" type="xsd:string"
minOccurs="0" />
<xsd:element name="FirstCost" type="xsd:decimal"
minOccurs="0" /> <xsd:element name="BusinessCost"
type="xsd:decimal" minOccurs="0" /> <xsd:element
name="EconomyCost"
type="xsa:decimal" minOccurs="0" /> </xsd:sequence>
</xsd: ccm,plexType> </xsd:element>
</xsd:choice>
</xsd:complexType> </xsd:element> </xsd:schema>
К этому определению схемы данных мы еще
вернемся позже, а сейчас продолжим
рассмотрение примера.
|