XML DB on SQL Server2005
在SQL Server2005中新增了一个xml类型来增强对XML数据的存储,检索。并提供了一组方法对xml类型的操作:
Query() 此方法用于对xml实例进行查询
Value() 此方法用于取出xml实例的值
Exist() 此方法用于确定查询返回非空的结果
Modify() 此方法用于指定XML DML语句执行更新
Nodes() 此方法用于将 XML 拆分成多行以将 XML 文档的组成部分传播到行集中。
创建架构集合:
CREATE XML SCHEMA COLLECTION mysc AS
'<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xdb="http://xmlns.oracle.com/xdb">
<xs:complexType name="CADDRType" xdb:SQLType="XML_CADDR">
<xs:sequence>
<xs:element name="CST_ADDR_STREET" type="xs:string"/>
<xs:element name="CST_ADDR_CITY" type="xs:string"/>
<xs:element name="CST_ADDR_STATE" type="xs:string"/>
<xs:element name="CST_ADDR_ZIP" type="xs:string"/>
<xs:element name="CST_ADDR_COUNTRY" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="CUSTOMER">
<xs:complexType xdb:SQLType="XML_CUSTOMER">
<xs:sequence>
<xs:element name="CST_ID" type="xs:float" nillable="false"/>
<xs:element name="CST_NAME" type="xs:string"/>
xmlns:xdb="http://xmlns.oracle.com/xdb">
<xs:complexType name="CADDRType" xdb:SQLType="XML_CADDR">
<xs:sequence>
<xs:element name="CST_ADDR_STREET" type="xs:string"/>
<xs:element name="CST_ADDR_CITY" type="xs:string"/>
<xs:element name="CST_ADDR_STATE" type="xs:string"/>
<xs:element name="CST_ADDR_ZIP" type="xs:string"/>
<xs:element name="CST_ADDR_COUNTRY" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="CUSTOMER">
<xs:complexType xdb:SQLType="XML_CUSTOMER">
<xs:sequence>
<xs:element name="CST_ID" type="xs:float" nillable="false"/>
<xs:element name="CST_NAME" type="xs:string"/>
<xs:element name="CST_TYPE" type="xs:string"/>
<xs:element name="CST_EMAIL" type="xs:string"/>
<xs:element name="CST_ADDR" type="CADDRType"/>
<xs:element name="CST_PHONE" type="xs:string"/>
<xs:element name="CST_JOINDATE" type="xs:date"/>
<xs:element name="CST_DESCRIPTION" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>'
<xs:element name="CST_EMAIL" type="xs:string"/>
<xs:element name="CST_ADDR" type="CADDRType"/>
<xs:element name="CST_PHONE" type="xs:string"/>
<xs:element name="CST_JOINDATE" type="xs:date"/>
<xs:element name="CST_DESCRIPTION" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>'
创建表:
Create table MyXmlTable
(
Key1 int,
XmlColumn xml (mysc)
);
添加一条记录:
Insert into MyXmlTable (Key1,XmlColumn)
Values (1,‘<CUSTOMER>
<CST_ID>1973</CST_ID>
<CST_NAME>FOODWORLD</CST_NAME>
<CST_TYPE>MERCHANT</CST_TYPE>
<CST_EMAIL>foodworld@foodinc.com</CST_EMAIL>
<CST_ADDR>
<CST_ADDR_STREET>18 SALISBURY ARCADE</CST_ADDR_STREET>
<CST_ADDR_CITY>TACOMA</CST_ADDR_CITY>
<CST_ADDR_STATE>WASHINGTON</CST_ADDR_STATE>
<CST_ADDR_ZIP>94682</CST_ADDR_ZIP>
<CST_ADDR_COUNTRY>USA</CST_ADDR_COUNTRY>
</CST_ADDR>
<CST_PHONE>345-879-893</CST_PHONE>
<CST_JOINDATE>1990-02-18</CST_JOINDATE>
<CST_DESCRIPTION>GROCERY MERCHANT</CST_DESCRIPTION>
</CUSTOMER>'));
创建索引:
CREATE PRIMARY XML INDEX 索引名称
ON 表名(列名)
检索数据:
Select XmlColumn.query(’/CUSTOMER/CST_NAME’)
from MyXmlTable
根据指定的XPath路径检索所有的节点,包含节点的标签
Select XmlColumn. value(’/CUSTOMER/CST_NAME[1]’,varchar(50))
from MyXmlTable
根据指定的XPath路径检索节点的值,不包含节点的标签
Select XmlColumn,.query(’/CUSTOMER/CST_NAME’)
from MyXmlTable
where XmlColumn.exist(’ /CUSTOMER[CST_ID=”1973”]’) = 1
1,表示 True(如果查询中的 XQuery 表达式返回一个非空结果)。即,它至少返回一个 XML 节点。
0,表示 False(如果它返回一个空结果)。
向xml实例添加节点:
Update 表名 set 实例.modify(
‘Insert (XML标记) (as first|as last)
Into|after|before (XPath路径) ’)
删除xml实例节点:
Update 表名 set 实例.modify(
‘delete (XPath路径) ’)
替换xml实例节点的值:
Update 表名 set 实例.modify(
‘ replace value of (XPath路径)
With 值’)
例如:将<CST_ID >2000</CST_ID >插入到XmlColumn对象的第1此出现的CUSTOMER标记的第1个子节点
Update MyXmlTable set XmlColumn.modify(‘Insert <CST_ID >2000</CST_ID >
As first into (/CUSTOMER)[1]’)
结合VS。net2005中的应用
SQLQuery.sql:
Create Table UserInfoTab
(
UserID varchar(50) primary key,
UserInfo xml
);
go
select isnull(max(UserID),getdate()) from UserInfoTab
delete UserInfoTab
go
select userid,userInfo from UserInfoTab
where userInfo.query('/UserInfo/UserName = "liuqiang"')
select UserID,UserInfo
from UserInfoTab
where
userInfo.value('(/UserInfo/UserName)[1]','varchar(50)') like '%liu%'
UserInfo.cs:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Xml;
using System.IO;
///<summary>
///用户信息类
///</summary>
public class UserInfo
{
public UserInfo(string name,int age,string address,string email,string phone)
{
this.strUserName = name;
this.intUserAge = age;
this.strUserAddress = address;
this.strUserEMail = email;
this.strUserPhone = phone;
}
private string strUserID = null;
private string strUserName = null;
private int intUserAge = 0;
private string strUserAddress = null;
private string strUserEMail = null;
private string strUserPhone = null;
#region相关属性
///<summary>
///用户编号
///</summary>
public string UserID
{
get
{
return this.strUserID;
}
}
///<summary>
///用户名称
///</summary>
public string UserName
{
get
{
return this.strUserName;
}
}
///<summary>
///用户年龄
///</summary>
public int UserAge
{
get
{
return this.intUserAge;
}
}
///<summary>
///用户地址
///</summary>
public string UserAddress
{
get
{
return this.strUserAddress;
}
}
///<summary>
///用户电子邮件
///</summary>
public string UserEMail
{
get
{
return this.strUserEMail;
}
}
///<summary>
///用户电话
///</summary>
public string UserPhone
{
get
{
return this.strUserPhone;
}
}
#endregion
///<summary>
///数据库连接字符串
///</summary>
private static string conString = "Data Source=.;Initial Catalog=XMLDatabase;Integrated Security=True";
public static string CreateUserID()
{
return DateTime.Now.ToString();
}
///<summary>
///添加一条新记录
///</summary>
///<param name="user">用户信息对象</param>
///<returns>操作是否成功</returns>
public static bool InsertNewUser(UserInfo user)
{
string userID = CreateUserID();
XmlDocument doc = ObjectToDOM(user);
MemoryStream stream = new MemoryStream();//建立临时内存流
doc.Save(stream);
using (SqlConnection conn = new SqlConnection())
{
conn.ConnectionString = conString;
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "Insert into UserInfoTab(UserID,UserInfo) values(@UserID,@UserInfo)";
cmd.Parameters.AddWithValue("@UserID" , userID);
cmd.Parameters.AddWithValue("@UserInfo", new SqlXml(stream));
int result = cmd.ExecuteNonQuery();
conn.Close();
return result > 0 ? true : false;
}
}
///<summary>
///根据用户信息编号查询用户信息
///</summary>
///<param name="userID">用户信息编号</param>
///<returns>xml读取器</returns>
public static XmlReader SelectUserByID(string userID)
{
using (SqlConnection conn = new SqlConnection())
{
conn.ConnectionString = conString;
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "Select UserInfo from UserInfoTab where UserID=@UserID";
cmd.Parameters.AddWithValue("@UserID", userID);
using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
SqlXml xmlDoc;
if (reader.Read())
{
xmlDoc = reader.GetSqlXml(0);
XmlReader xmlRader = xmlDoc.CreateReader();
return xmlRader;
}
else
{
xmlDoc = null;
return null;
}
}
}
}
///<summary>
///将对象转换成XML文档格式
///</summary>
///<param name="user">用户信息</param>
///<returns>xml文档对象</returns>
public static XmlDocument ObjectToDOM(UserInfo user)
{
XmlDocument doc = new XmlDocument();
XmlDeclaration dec = doc.CreateXmlDeclaration("1.0",null,null);
doc.AppendChild(dec);
XmlElement info = doc.CreateElement("UserInfo");
doc.AppendChild(info);
XmlElement name = doc.CreateElement("UserName");
name.InnerText = user.strUserName;
info.AppendChild(name);
XmlElement age = doc.CreateElement("UserAge");
age.InnerText = user.intUserAge.ToString();
info.AppendChild(age);
XmlElement address = doc.CreateElement("UserAddress");
address.InnerText = user.strUserAddress;
info.AppendChild(address);
XmlElement email = doc.CreateElement("UserEMail");
email.InnerText = user.strUserEMail;
info.AppendChild(email);
XmlElement phone = doc.CreateElement("UserPhone");
phone.InnerText = user.strUserPhone;
info.AppendChild(phone);
return doc;
}
}