摘要:.NET平臺的優勢結合XML技術,提供了關系數據庫之間轉換的可能。通過實例演示了其可行性,將SQL Server數據庫轉換為XML文件,繼而將XML文件轉換為其他關系數據庫,實現了多種關系數據庫之間的數據轉換。
關鍵詞:數據庫轉換;.NET;XML
中圖分類號:TP311.13文獻標識碼:A 文章編號:1009-3044(2008)26-1615-02
Relational Databases Conversion Based on .NET Platform
HU Shu-gang
(Dongying Vocational College, Dongying 257091, China)
Abstract: Combining the advantages of XML technology,.NET platform provides the feasibility of data conversion between relational databases. One example demonstrated the SQL Server database can be converted to an XML file, and then the XML file can be converted to other database. It has realized the data conversion between relational databases.
Key words: database conversion; .NET; XML
1 引言
網絡資源中通常包含多種格式和管理系統的關系數據庫,為了實現資源的共建共享,需要完成多種數據庫之間的數據轉換。不同的開發商采用分布式對象技術和各自的思路來實現數據庫的互操作,如OMG的CORBA技術、Sun公司的EJB/RMI和微軟的.NET技術等。
2 數據庫轉換思路
.NET是微軟公司開發的下一代基于互聯網平臺的軟件開發構想,它提供了一個全新的編程模型。該平臺建立在XML和因特網標準協議的基礎上,具有平臺獨立性和語言獨立性,它包含了強大數據庫操控能力的ADO.NET。ADO.NET編程模型由一系列的數據庫相關類和接口組成,運用ADO.NET技術,應用程序既能訪問關系型數據庫中的數據,又能訪問層次化的XML數據[1]。XML是W3C發布的通用標記語言SGML的一個簡化子集。它是一種存儲和傳輸數據的行業標準格式,普遍貫穿于.NET平臺,具有簡單性、可擴展性、互操作性和開放性等特點,其本質特點是數據獨立,它存儲的數據全部是文本,而且使用標記標示,利于網絡傳輸。XML模式提供了很強的數據類型識別功能,可正確處理各種數據類型。XML和.NET的結合為解決數據庫互操作問題奠定了基礎[2]。通過以上分析,可以在.NET平臺上,以XML為中間數據源完成多種關系數據庫之間的轉換[3]。演示示例用的操作系統是Windows XP Professional,開發平臺為Visual Studio 2005,示例用C#語言編寫。
2.1 數據庫的導入[4]
為了導入SQLServe數據庫,先用Connection對象連接數據庫,演示示例中用SqlConnection連接了服務器METC\\SQLEXPRESS的數據庫books.mdf。將數據庫讀入DataSet。DataSet對象主要存放數據庫的DataTable的對象,可以使用DataAdapter建立DataSet對象。盡管DataSet可以存儲數據,但仍需要使用DataAdapter對象來創建和初始化各種表,還需要使用Fill()方法來把查詢結果移入到DataSet中去,再將數據寫入到XML文件。關鍵源代碼如下。
String strTableName = \"books\";
String strConnection = \"server=METC\\\\SQLEXPRESS;database=books;uid=sa;pwd=;trusted_connection=yes \";
String strSql = \"select * from \" + strTableName;
SqlConnection objConn = new SqlConnection(strConnection);
SqlDataAdapter objAdapter = new SqlDataAdapter(strSql, objConn);
DataSet objDSet = new DataSet();
objAdapter.Fill(objDSet, \"temp\");
XmlTextWriter objXmlWriter;
String strtemp1 = Request.PhysicalApplicationPath;
String strpath = strtemp1 + \"newxml.xml\";
objXmlWriter = new XmlTextWriter(strpath, 1);
objXmlWriter.WriteStartDocument();
objXmlWriter.WriteStartElement(\"xml\");
for (int i = 0; i < objDSet.Tables[\"temp\"].Rows.Count; i++)
{
objXmlWriter.WriteStartElement(\"menu\");
for (int j = 0; j < objDSet.Tables[\"temp\"].Columns.Count; j++)
{
objXmlWriter.WriteAttributeString(objDSet.Tables[\"temp\"].Columns[j].ColumnName, objDSet.Tables[\"temp\"].Rows[i][j].ToString());
}
objXmlWriter.WriteEndElement();
}
objXmlWriter.WriteEndElement();
objXmlWriter.WriteEndDocument();
objXmlWriter.Close();
2.2 數據的導出[5-6]
以下演示示例是將以上創建的“newxml.xml”文件轉換為Access數據庫demo.mdb中的一個表“newxml”。首先建立與目標數據庫的連接,也就是通過OLE DB Provider提供的OleDBConnection對象建立與Access數據庫demo.mdb的連接。當然,該示例也可通過OLE DB Provider提供的其他連接數據庫的對象來連接Oracle、Sybase或DB2這樣的數據庫以及Excel表格。以下關鍵源代碼部分省略了命名空間的引用、系統自生成代碼和對數據庫中表是否建立的檢查部分。
private void TableCheck()
{ OleDbConnection oledbConn = new OleDbConnection(textBoxOleDb.Text);
Try
{ oledbConn.Open();
DataTable schemaTable = oledbConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object[] {1, 1, tableName, \"TABLE\"});
String sqlCmd = \"\";
if(schemaTable.Rows.Count < 1)
{sqlCmd = \"create table \" + tableName + \" (\";
for(int i = 0;i < dataTableXml.Columns.Count;i++)
{sqlCmd = sqlCmd + dataTableXml.Columns[i].ColumnName.ToString() + \" char(100),\";}
sqlCmd= sqlCmd .Substring(0,sqlCmd.Length - 1) + \");\";
OleDbCommand oledbCmd = new OleDbCommand(sqlCmd,oledbConn);
oledbCmd.ExecuteNonQuery();}
}
catch
{Message.Text = \"數據庫不存在或無法創建表.\";}
finally
{oledbConn.Close();}
}
private void TableInsert()
{ OleDbConnection oledbConn = new OleDbConnection(textBoxOleDb.Text);
try
{ oledbConn.Open();
foreach(DataRow dr in dataTableXml.Rows)
{ string sqlCmd = \"insert into [\" + tableName + \"] (\";
for(int i = 0;i < dataTableXml.Columns.Count;i++)
{sqlCmd = sqlCmd + dataTableXml.Columns[i].ColumnName.ToString() + \",\";}
sqlCmd= sqlCmd.Substring(0,sqlCmd.Length - 1) + \") values (\";
for(int x = 0;x < dataTableXml.Columns.Count;x++)
{sqlCmd = sqlCmd + \"'\" + dr[x].ToString().Replace(\"'\",\"''\") + \"',\";}
sqlCmd = sqlCmd.Substring(0,sqlCmd.Length - 1) + \");\";
OleDbCommand oledbCmd = new OleDbCommand(sqlCmd,oledbConn);
oledbCmd.ExecuteNonQuery();
}
}
}
3 結束語
通過以上實例,演示了以XML為中間轉換數據源,在.NET平臺上方便地完成異構關系數據庫之間的數據轉換和共享。基于.NET平臺,充分利用XML技術的優勢,來解決異構數據庫集成的問題,能夠給用戶提供一個透明的全局數據庫,方便用戶的使用,還使得系統在可擴展性、安全性、可維護性等方面有所提高。
參考文獻:
[1] Lair R, Lefbvre J.ASP.NET開發人員手冊[M].張俊,譯.北京:電子工業出版社,2002:38-39,169-193,246-488.
[2] Bray T, Paoli J, Sperberg-McQueen C M, et al.XML標準[EB/OL].[2006-08-16].http://www.w3.org/TR/2006/REC-xml-20060816/.
[3] 石玉晶,牛存良,馬新娜.使用XML進行異構數據庫間數據傳送[J].現代計算機,2003,19(11):79-80.
[4] 呂品,夏紅霞,李明.異構數據庫互操作平臺的開發研究[J].武漢理工大學學報,2003,25(1):35-37.
[5] 李應偉,姚素霞,景麗.ASP.NET數據庫高級教程(C#篇)[M].北京:清華大學出版社,2004:44-58,116-140.
[6] 郭廣軍,劉鳳龍,胡玉平..NET中基于XML的非連接數據訪問與同步技術研究[J].現代計算機,2005,(4):4-9.