public string ExecuteSqlDataReaderSelect(string CustomerID,
string ConnectionString)
{
SqlDataReader myDataReader = null;
// 建立一個資料庫連接對象
SqlConnection mySqlConnection = new SqlConnection
(ConnectionString);
// 建立一個資料庫命令對象,並在SQL語句中運用FOR XML子句
SqlCommand mySqlCommand = new SqlCommand("SELECT * FROM Customers
WHERE CustomerID = @CustomerID FOR XML RAW", mySqlConnection);
mySqlCommand.CommandType = CommandType.Text;
// 為其參數集添加參數
mySqlCommand.Parameters.Add("@CustomerID", SqlDbType.Char, 5,
"CustomerID");
mySqlCommand.Parameters["@CustomerID"].Value = CustomerID;
mySqlConnection.Open();
// 執行資料庫命令對象的ExecuteReader操作以取得一個資料閱讀器對象
myDataReader = mySqlCommand.ExecuteReader(CommandBehavior.
CloseConnection);
// 建立一個StringBuilder對象以構造XML字串
StringBuilder xml = new StringBuilder(8192);
// 不斷從資料閱讀器中擷取XML資料並添加到StringBuilder對象中
while (myDataReader.Read())
{
if (!myDataReader.IsDBNull(0))
xml.Append(myDataReader.GetString(0));
}
myDataReader.Close();
mySqlConnection.Close();
// 返回XML資料的字串形式
return xml.ToString();
}
SqlDataReader類為我們提供了一種唯讀、向前的資料訪問方式,該特性使得它成為訪問SQL Server資料庫速度最快的一種方法。然而SqlDataReader類並不直接支援XML類型的資料,你必須手動編寫代碼將資料轉換成XML資料或者通過運行FOR XML查詢子句來返回XML類型的資料。這裡,我們將使用FOR XML RAW子句來擷取XML資料。
上面的ExecuteSqlDataReaderSelect()方法首先聲明一個SqlDataReader對象,然後通過函數的資料庫連接字串參數建立一個SqlConnection對象,並根據帶有FOR XML RAW子句的SELECT語句和上面的SqlConnection對象建立一個SqlCommand對象。之後,該方法為SqlCommand的參數集添加參數並為使用者ID參數賦值。開啟SqlConnection串連後,該方法將SqlCommand對象的ExecuteReader()方法的傳回值賦給SqlDataReader對象,並通過一個StringBuilder對象讀取SqlDataReader對象中的XML資料。最後,該方法關閉SqlDataReader對象和SqlConnection對象並以字串的形式返回XML資料。
最後,為該類添加ExecuteSqlXmlSelect()方法,該方法如下:
public string ExecuteSqlXmlSelect(string CustomerID, string
ConnectionString, bool ClientSide)
{
// 建立一個SqlXmlCommand對象
SqlXmlCommand cmd = new SqlXmlCommand(ConnectionString);
cmd.RootTag = "Customers";
cmd.ClientSideXml = ClientSide;
cmd.CommandText = "SELECT * FROM Customers WHERE CustomerID =
'" + CustomerID + "' FOR XML RAW";
// 執行SqlXmlCommand對象的ExecuteXmlReader操作以取得一個XmlReader對象
XmlReader xr = cmd.ExecuteXmlReader();
// 建立一個XmlDocument對象
XmlDocument xd = new XmlDocument();
// 運用其Load方法將擷取的XML資料載入到一個DOM中並返回XML資料的字串形式
xd.Load(xr);
return xd.OuterXml
}
SQLXML託管類是SQLXML 3.0包的一部分,SQLXML 3.0包擴充了SQL Server 2000的XML功能。SQLXML託管類是原生的.NET類,它提供了通過編程方法訪問XML資料的功能。上面的ExecuteSqlXmlSelect()方法首先運用資料庫連接字串建立一個SqlXmlCommand對象。同時,由FOR XML子句擷取的XML資料往往只是一個XML片段,並不是結構良好(Well-Formed)的XML資料,要使得XML成為結構良好的,你必須設定SqlXmlCommand對象的RootTag屬性。在本執行個體中,我們將該屬性設定為"Customers"。
最後要介紹的是ADO 2.6機制,該機制是在VB 6.0中實現的。我們先建立一個名為DBXMLVS6的ActiveX DLL項目,然後把Class1修改為ADO26,接著添加一個到ActiveX Data Objects 2.6的引用。一旦完畢,為該類添加一個ExecuteSelect()方法如下:
Public Function ExecuteSelect(
CustomerID As String,
ConnectionString As String)
As String
Set conn = New ADODB.Connection
conn.ConnectionString = ConnectionString
conn.Open
Set cmd = New ADODB.Command
cmd.ActiveConnection = conn
cmd.CommandText = "select * from customers
where CustomerID = '" & CustomerID & "'"
Set rs = cmd.Execute
Set adoStream = New ADODB.Stream
adoStream.Type = adTypeText
adoStream.Open
rs.Save adoStream, adPersistXML
'返回XML字串
ExecuteSelect = adoStream.ReadText()
End Function