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