由於XML文件只存儲數據,並無數據類型描述,因此從XML文件讀入數據可能會出現數據類型與原先不符的情況。比如,有一表employee,結構如下:ID(INT),NAME(varchar(50)),在XML裡表示為<EMPLOYEE><ID>1</ID><NAME>張三</NAME></EMPLOYEE>。這樣,ID的類型原本為整型,而此時系統卻以為是字符型!
因為這個情況我們遇到了點問題。
數據導入的時候,往往要加以分析,將導入的數據和現有數據比較,以確定是插入、更新還是刪除。比較的算法,最簡單當然是將兩個數據集(DataSet)來個嵌套循環,逐條記錄比較。不過這種方法效率不高,可以改進一下,將兩個數據集排好序,然後再來比較。
怎樣排序呢?從XML文件裡讀取數據,存放在數據集dsXML裡,而現有數據,存放在數據集dsCur裡,每個數據集裡都只有一個DataTable。可以用DataTable的Select方法來實現排序,方法如下:
//從XML文件裡讀取數據
DataSet dsXml = new DataSet(“dsXML”);
DsXml.ReadXml(“employee.XML”);
//從現有數據庫中讀取數據。GetData是自定義的函數,從現有數據庫中提取數據
DataSet dsCur = GetData();
//按照id的順序排序。
//其中Select第一個參數是過濾條件,這裡為空表示所有記錄都適合;第二個參數表示排序字段
DataRow[] drsXml = dsXML.Tables[0].Select(“”,”id”);
DataRow[] drsCur = dsCur.Tables[0].Select(“”,”id”);
然後比較這兩個記錄集:drsXML與drsCur。
但是運行的結果卻跟原先設想大相徑庭。
什麼原因呢?
原來就是因為在dsXml裡,字段id是字符型。字符型排序不同於數值排序,如果讓系統比較,”9”肯定大於”10”。因此,dsXML的排序沒有得到我們預期的效果。
看來要讓系統知道id是整型。如何能做到?可以結合XML架構文件。
dsXml.ReadXMLSchema("employee.xsd");
dsXml.ReadXml(“employee.xml”,XMLReadMode.InferSchema);
這樣子讀出來後,數據結構就跟架構文件employee.xsd裡描述的一模一樣了。
補充一點,本人對架構文件語法不熟悉,是先用從數據庫中拿到的數據集dsCur輸出來,然後再稍作修改:
dsCur. WriteXMLSchema(“employee.xsd”);