Hoán chuyển ADO qua XML
Kể từ ActiveX Data Objects version 2.1 (ADO 2.1) trở đi, Microsoft ADO engine có thể cho ta XML file dưới dạng Microsoft XML – Data Schema format, còn đuợc gọi là XML Reduced Data Schema, hay đơn giản hơn là Reduced Data. XML Reduced Data Schema nói rõ datatypes và những tính chất tương tợ của schema (tức là default values, tin tức về primary key, .v.v..) từ database và để tin tức nầy trong phần đầu của XML file. Phần sau của XML chứa data trong dạng những rows.
Một khi đã có ADO recordset rồi, bạn có thể lưu trử (save) data vào một XML file bằng cách dùng Function Save của recordset. ADO 2.1 chỉ cho ta save data vào một XML file. Nhưng ADO 2.5 cho ta convert recordset thành stream format. Nếu argument thứ nhất của Function Save là một URL thì Save cho ra data dưới dạng intrinsic binary format. Tuy nhiên, nếu ta cho thêm argument thứ nhì là adPersistXML flag thì stream được đổi thành một XML stream.
Nếu bạn chưa hề nghe qua danh từ stream trước đây, hãy thử tưởng tượng chuyện nầy. Có hai cách để lái buôn dưa hấu giao hàng. Cách thứ nhất họ khiêng dưa hấu từ dưới ghe lên bờ, chất thành một núi nhỏ trên sàn để một chốc sau bạn hàng cho người đến chuyên chở đi. Cách thứ hai, bạn hàng lái xe đến cặp sát bờ sông, một lái buôn đứng dưới ghe ném từng trái dưa hấu lên cho một bạn hàng đứng trên xe chụp rồi chuyển qua cho người khác sắp lên xe nầy hay thảy qua xe khác nếu muốn phân loại dưa hấu lớn nhỏ.
Cách giao hàng thứ nhất giống như save data vào một file. Trong cách giao hàng thứ hai, những trái dưa hấu được ném liên tục bay lên bờ giống như một dòng nước bắn đi, nghĩa đen của chữ stream là dòng nước.
Khi data được chuyển đi dưới dạng một stream, ở đầu nhận có thể xử lý data lập tức, và nhiều khi không cần chứa data nữa. Trong thí dụ nầy, vừa chụp đuợc trái dưa người bạn hàng phải quyết định ngay, nếu dưa hấu lớn thì để lên xe nầy, nếu dưa hấu nhỏ hay nhẹ quá thì thảy qua xe kia.
Trong ADO 2.1, bạn bị bắt buộc phải output stream ra một file, điều nầy có khi phí thì giờ. Cái stream phải đuợc đổi ra Unicode formated text string, spool ra hard disk qua file interface. Rồi nếu bạn cần XML, file ấy phải được loaded và parsed trở lại ra XML stream. ADO 2.5 cho phép bạn viết thẳng kết quả vào một XML DOM (Document Object Model) document, khỏi phải save ra file rồi đọc và parse trở lại.Chương trình mẫu
Bạn có thể download chương trình mẫu ADOXML.zip để xem cách save data từ ADO ra XML. Bonus là phần load data từ XML và save ngược lại vào Access Database. Ðể chạy chương trình ADOXML bạn cần Project | References hai libraries: Microsoft ActiveX Data Objects 2.5 Library và Microsoft Data Binding Collection.
ADO recordset dùng ở đây để biểu diễn data từ table Publishers của BIBLIO.MDB database. Kết quả là một XML file gồm có ba phần:
Phần thứ nhất: data giới thiệu dưới dạng attributes của XML
<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
Phần thứ hai: Schema, cắt nghĩa về chính datatype và data structure
<s:Schema id="RowsetSchema"> <s:ElementType name="row" content="eltOnly" rs:updatable="true"> <s:AttributeType name="PubID" rs:number="1" rs:maydefer="true" rs:basetable="Publishers" rs:basecolumn="PubID" rs:keycolumn="true"> <s:datatype dt:type="int" dt:maxLength="4" rs:precision="10" rs:fixedlength="true"></s:datatype> </s:AttributeType> <s:AttributeType name="Name" rs:number="2" rs:nullable="true" rs:maydefer="true" rs:write="true" rs:basetable="Publishers" rs:basecolumn="Name"> <s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="50"></s:datatype> </s:AttributeType> <s:AttributeType name="c2" rs:name="Company Name" rs:number="3" rs:nullable="true" rs:maydefer="true" rs:write="true" rs:basetable="Publishers" rs:basecolumn="Company Name"> <s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="255"></s:datatype> </s:AttributeType> <s:AttributeType name="Address" rs:number="4" rs:nullable="true" rs:maydefer="true" rs:write="true" rs:basetable="Publishers" rs:basecolumn="Address"> <s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="50"></s:datatype> </s:AttributeType> <s:AttributeType name="City" rs:number="5" rs:nullable="true" rs:maydefer="true" rs:write="true" rs:basetable="Publishers" rs:basecolumn="City"> <s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="20"></s:datatype> </s:AttributeType> <s:AttributeType name="Fax" rs:number="6" rs:nullable="true" rs:maydefer="true" rs:write="true" rs:basetable="Publishers" rs:basecolumn="Fax"> <s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="15"></s:datatype> </s:AttributeType> <s:AttributeType name="State" rs:number="7" rs:nullable="true" rs:maydefer="true" rs:write="true" rs:basetable="Publishers" rs:basecolumn="State"> <s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="10"></s:datatype> </s:AttributeType> <s:AttributeType name="Telephone" rs:number="8" rs:nullable="true" rs:maydefer="true" rs:write="true" rs:basetable="Publishers" rs:basecolumn="Telephone"> <s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="15"></s:datatype> </s:AttributeType> <s:AttributeType name="Zip" rs:number="9" rs:nullable="true" rs:maydefer="true" rs:write="true" rs:basetable="Publishers" rs:basecolumn="Zip"> <s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="15"></s:datatype> </s:AttributeType> <s:AttributeType name="Comments" rs:number="10" rs:nullable="true" rs:maydefer="true" rs:write="true" rs:basetable="Publishers" rs:basecolumn="Comments"> <s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="1073741824" rs:long="true"></s:datatype> </s:AttributeType> <s:extends type="rs:rowbase"></s:extends> </s:ElementType> </s:Schema>
Phần thứ ba: data, mỗi datafield value là một attribute value của row
<rs:data> <z:row PubID="1" Name="SAMS" c2="SAMS" Address="11711 N. College Ave., Ste 140" City="Carmel" Fax=" " State="IN" Telephone=" " Zip="46032" Comments=" "></z:row> <z:row PubID="2" Name="PRENTICE HALL" c2="PRENTICE HALL" Address="15 Columbus Cir." City="New York" Fax=" " State="NY" Telephone="800-922-0579" Zip="10023" Comments=" "></z:row> <z:row PubID="3" Name="M & T" c2="M & T BOOKS" Address=" " City=" " Fax=" " State=" " Telephone=" " Zip=" " Comments=" "></z:row> <z:row PubID="4" Name="MIT" c2="MIT PR" Address="Long Island" City=" " Fax=" " State="N.Y." Telephone=" " Zip=" " Comments=" "></z:row> <z:row PubID="5" Name="MACMILLAN COMPUTER" c2="MACMILLAN COMPUTER PUB" Address="11 W. 42nd St., 3rd flr." City="New York" Fax=" " State="NY" Telephone="212-869-7440" Zip="10036" Comments=" "></z:row> <z:row PubID="6" Name="HIGHTEXT PUBNS" c2="HIGHTEXT PUBNS" Address=" " City=" " Fax=" " State=" " Telephone=" " Zip=" " Comments=" "></z:row> <z:row PubID="7" Name="SPRINGER VERLAG" c2="SPRINGER VERLAG" Address=" " City=" " Fax=" " State=" " Telephone=" " Zip=" " Comments=" "></z:row> <z:row PubID="8" Name="O" REILLY=" c2=" O'REILLY=" Address=" 90=" City=" Cambridge'=" " State="MA" Telephone=" " Zip="02140" Comments=" "></z:row> <z:row PubID="9" Name="ADDISON-WESLEY" c2="ADDISON-WESLEY PUB CO" Address="Rte 128" City="Reading" Fax="617-964-9460" State="MA" Telephone="617-944-3700" Zip="01867" Comments=" "></z:row> <z:row PubID="10" Name="JOHN WILEY & SONS" c2="JOHN WILEY & SONS" Address="605 Third Ave" City="New York" Fax="212-850-6088 " State="NY" Telephone="212-850-6000" Zip="10158" Comments="DATABASES MICROCOMPUTER SOFTWARE PAPERBACK BOOKS - TRADE TEXTBOOKS - COLLEGE DICTIONARIES, ENCYCLOPEDIAS PERIODICALS PROFESSIONAL BOOKS SCIENCE (GENERAL) BUSINESS SOCIAL SCIENCES AND SOCIOLOGY COMPUTER SCIENCE, DATA PROCESSING ENGINEERING (GENERAL)"></z:row> <z:row PubID="11" Name="SINGULAR" c2="SINGULAR PUB GROUP" Address=" " City=" " Fax=" " State=" " Telephone=" " Zip=" " Comments=" "></z:row> <z:row PubID="12" Name="Duke Press" c2="Duke Press" Address=" " City=" " Fax=" " State=" " Telephone=" " Zip=" " Comments=" "></z:row> <z:row PubID="13" Name="Oxford University" c2="Oxford University Press" Address=" " City=" " Fax=" " State=" " Telephone=" " Zip=" " Comments=" "></z:row> <z:row PubID="14" Name="Mit Press" c2="Mit Press" Address=" " City=" " Fax=" " State=" " Telephone=" " Zip=" " Comments=" "></z:row> <z:row PubID="15" Name="CAMBRIDGE UNIV" c2="CAMBRIDGE UNIV PR" Address=" " City=" " Fax=" " State=" " Telephone=" " Zip=" " Comments=" "></z:row> <z:row PubID="16" Name="Q E D" c2="Q E D PUB CO" Address=" " City=" " Fax=" " State=" " Telephone=" " Zip=" " Comments=" "></z:row> <z:row PubID="17" Name="Cambridge University" c2="Cambridge University Press" Address=" " City=" " Fax=" " State=" " Telephone=" " Zip=" " Comments=" "></z:row> <z:row PubID="18" Name="WORLD SCIENTIFIC" c2="WORLD SCIENTIFIC PUB CO" Address=" " City=" " Fax=" " State=" " Telephone=" " Zip=" " Comments=" "></z:row> <z:row PubID="19" Name="IDG" c2="IDG BOOKS WORLDWIDE" Address=" " City=" " Fax=" " State=" " Telephone=" " Zip=" " Comments=" "></z:row> <z:row PubID="20" Name="GOWER PUB" c2="GOWER PUB CO" Address=" " City=" " Fax=" " State=" " Telephone=" " Zip=" " Comments=" "></z:row> </rs:data> </xml>