小议sql查询返回xml数据之应用【转载】
2011-04-14 16:43
701 查看
今天查看邮件,看到一标题Using the FOR XML Clause to Return Query Results as XML,点进去看了看,以前也是知道sql server 查询可以返回xml格式,但具体一到应用中比较少,读过文章后,想到自己的项目有调用远程web服务,传xml格式串方法,这个xml串是拼接而成的。想到此,决定做个测试,看程序中如何接收sql查询返回xml格式,为以后做个笔记,方便自己查找。测试步骤:
1. 创建测试数据,以用户表为例,创建语句和添加数据语句如下:
/*创建表*/
CREATE TABLE [dbo].[Users](
[ID] [int] IDENTITY(1,1) NOT NULL,
[UserID] [varchar](20) COLLATE Chinese_PRC_CI_AS NULL,
[UserName] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[Address] [varchar](260) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
-----------------插入测试数据
INSERT [Users] ( [UserID],[UserName],[Address]) VALUES ('su20090812001','kevin','beijing')
INSERT [Users] ( [UserID],[UserName],[Address]) VALUES ( 'su20090912002','zhangsan','tianjin')
INSERT [Users] ( [UserID],[UserName],[Address]) VALUES ( 'su20090701234','wangwu','shanghai')
INSERT [Users] ( [UserID],[UserName],[Address]) VALUES ( 'su20090912004','lisi','beijing')
INSERT [Users] ( [UserID],[UserName],[Address]) VALUES ( 'su20090912005','jialiu','hebei')
INSERT [Users] ( [UserID],[UserName],[Address]) VALUES ( 'su20090912007','qianlong','zhejiang') 2. 在sql server management studio 中温习下 sql 查询加for xml后的结果集,主要是参考Using the FOR XML Clause to Return Query Results as XML文内容,在sql 语句结束处加for xml auto root(‘xxx’) elements等等。
(1):sql 语句:SELECT*FROM Users u FORXMLraw
执行结果如下:
<row ID="1" UserID="su20090812001" UserName="kevin" Address="beijing" /><row ID="2" UserID="su20090912002" UserName="zhangsan" Address="tianjin"/>
<row ID="3" UserID="su20090701234" UserName="wangwu" Address="shanghai"/>
<row ID="4" UserID="su20090912004" UserName="lisi" Address="beijing"/>
<row ID="5" UserID="su20090912005" UserName="jialiu" Address="hebei"/>
<row ID="6" UserID="su20090912007" UserName="qianlong" Address="zhejiang"/>
(2):Sql语句:SELECT*FROM Users u FORXMLRAW('User')
<User ID="1" UserID="su20090812001" UserName="kevin" Address="beijing" /> <User ID="2" UserID="su20090912002" UserName="zhangsan" Address="tianjin"/>
<User ID="3" UserID="su20090701234" UserName="wangwu" Address="shanghai"/>
<User ID="4" UserID="su20090912004" UserName="lisi" Address="beijing"/>
<User ID="5" UserID="su20090912005" UserName="jialiu" Address="hebei"/>
<User ID="6" UserID="su20090912007" UserName="qianlong" Address="zhejiang" />
(3):Sql 语句SELECT * FROM Users u FOR XML RAW('User'),ROOT('Users'),elements 不在copy
执行结果了,大家自己执行下就可以看到效果了。
3. 在ASP.NET中如何获取这种形式的数据集呢。主要用到xmlreader(xmlTextReader),这里以xmlreader为例,
在程序代码中,主要用是用SqlCommand对象ExecuteXmlReader()方法,
下面是
具体的实现代码:
using System.Web.UI.WebControls;
using System.Xml;
using System.Data;
using System.Data.SqlClient;
using System.Text;
public partial class xmlUser : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
GetUserXml();
}
}
private void GetUserXml()
{
SqlConnection conn = new SqlConnection("server=(local);uid=sa;pwd=kevin;database=demo;");
SqlCommand cmd = new SqlCommand("SELECT * FROM Users u FOR XML RAW('User'),ROOT('Users'),elements",conn);
XmlReader myreader = null;
try
{
conn.Open();
myreader = cmd.ExecuteXmlReader();
StringBuilder sb = new StringBuilder();
myreader.MoveToElement();
while (myreader.IsStartElement())
{ ///读取xml部分
sb.Append(myreader.ReadOuterXml());
}
///显示xml的内容
Response.Write(Server.HtmlEncode(sb.ToString()).Replace("\n", "<br>"));
}
catch(SqlException err)
{
//写日志略
}
finally
{
conn.Close();
}
}
}
运行结果:
<Users><User><ID>1</ID><UserID>su20090812001</UserID><UserName>kevin</UserName><Address>beijing</Address></User><User><ID>2</ID><UserID>su20090912002</UserID><UserName>zhangsan</UserName><Address>tianjin</Address></User><User><ID>3</ID><UserID>su20090701234</UserID><UserName>wangwu</UserName><Address>shanghai</Address></User><User><ID>4</ID><UserID>su20090912004</UserID><UserName>lisi</UserName><Address>beijing</Address></User><User><ID>5</ID><UserID>su20090912005</UserID><UserName>jialiu</UserName><Address>hebei</Address></User><User><ID>6</ID><UserID>su20090912007</UserID><UserName>qianlong</UserName><Address>zhejiang</Address></User></Users>
得到sql 返回的xml格式的数据,以前我的那个项目拼接成的xml格式的字符串就可以省去一大部分拼接代码。没有测试过是在程序这边拼接效率好还是数据库返回xml数据效率 好,但编写的程序代码是减少很多。有兴趣的同学帮忙测测这两种方式哪种效率更好些呢。欢迎大家扔砖头。
参考:
Using the FOR XML Clause to Return Query Results as XML
http://www.simple-talk.com/content/article.aspx?article=720
如何使用SQLSERVER2000中的XML功能
http://www.legalsoft.com.cn/docs/docs/11/1001.html
使用ExecuteXMLReader()读取XML片段
http://blog.csdn.net/sunhaiwei_andy/archive/2008/04/14/2289586.aspx
1. 创建测试数据,以用户表为例,创建语句和添加数据语句如下:
/*创建表*/
CREATE TABLE [dbo].[Users](
[ID] [int] IDENTITY(1,1) NOT NULL,
[UserID] [varchar](20) COLLATE Chinese_PRC_CI_AS NULL,
[UserName] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[Address] [varchar](260) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
-----------------插入测试数据
INSERT [Users] ( [UserID],[UserName],[Address]) VALUES ('su20090812001','kevin','beijing')
INSERT [Users] ( [UserID],[UserName],[Address]) VALUES ( 'su20090912002','zhangsan','tianjin')
INSERT [Users] ( [UserID],[UserName],[Address]) VALUES ( 'su20090701234','wangwu','shanghai')
INSERT [Users] ( [UserID],[UserName],[Address]) VALUES ( 'su20090912004','lisi','beijing')
INSERT [Users] ( [UserID],[UserName],[Address]) VALUES ( 'su20090912005','jialiu','hebei')
INSERT [Users] ( [UserID],[UserName],[Address]) VALUES ( 'su20090912007','qianlong','zhejiang') 2. 在sql server management studio 中温习下 sql 查询加for xml后的结果集,主要是参考Using the FOR XML Clause to Return Query Results as XML文内容,在sql 语句结束处加for xml auto root(‘xxx’) elements等等。
(1):sql 语句:SELECT*FROM Users u FORXMLraw
执行结果如下:
<row ID="1" UserID="su20090812001" UserName="kevin" Address="beijing" /><row ID="2" UserID="su20090912002" UserName="zhangsan" Address="tianjin"/>
<row ID="3" UserID="su20090701234" UserName="wangwu" Address="shanghai"/>
<row ID="4" UserID="su20090912004" UserName="lisi" Address="beijing"/>
<row ID="5" UserID="su20090912005" UserName="jialiu" Address="hebei"/>
<row ID="6" UserID="su20090912007" UserName="qianlong" Address="zhejiang"/>
(2):Sql语句:SELECT*FROM Users u FORXMLRAW('User')
<User ID="1" UserID="su20090812001" UserName="kevin" Address="beijing" /> <User ID="2" UserID="su20090912002" UserName="zhangsan" Address="tianjin"/>
<User ID="3" UserID="su20090701234" UserName="wangwu" Address="shanghai"/>
<User ID="4" UserID="su20090912004" UserName="lisi" Address="beijing"/>
<User ID="5" UserID="su20090912005" UserName="jialiu" Address="hebei"/>
<User ID="6" UserID="su20090912007" UserName="qianlong" Address="zhejiang" />
(3):Sql 语句SELECT * FROM Users u FOR XML RAW('User'),ROOT('Users'),elements 不在copy
执行结果了,大家自己执行下就可以看到效果了。
3. 在ASP.NET中如何获取这种形式的数据集呢。主要用到xmlreader(xmlTextReader),这里以xmlreader为例,
在程序代码中,主要用是用SqlCommand对象ExecuteXmlReader()方法,
下面是
具体的实现代码:
using System.Web.UI.WebControls;
using System.Xml;
using System.Data;
using System.Data.SqlClient;
using System.Text;
public partial class xmlUser : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
GetUserXml();
}
}
private void GetUserXml()
{
SqlConnection conn = new SqlConnection("server=(local);uid=sa;pwd=kevin;database=demo;");
SqlCommand cmd = new SqlCommand("SELECT * FROM Users u FOR XML RAW('User'),ROOT('Users'),elements",conn);
XmlReader myreader = null;
try
{
conn.Open();
myreader = cmd.ExecuteXmlReader();
StringBuilder sb = new StringBuilder();
myreader.MoveToElement();
while (myreader.IsStartElement())
{ ///读取xml部分
sb.Append(myreader.ReadOuterXml());
}
///显示xml的内容
Response.Write(Server.HtmlEncode(sb.ToString()).Replace("\n", "<br>"));
}
catch(SqlException err)
{
//写日志略
}
finally
{
conn.Close();
}
}
}
运行结果:
<Users><User><ID>1</ID><UserID>su20090812001</UserID><UserName>kevin</UserName><Address>beijing</Address></User><User><ID>2</ID><UserID>su20090912002</UserID><UserName>zhangsan</UserName><Address>tianjin</Address></User><User><ID>3</ID><UserID>su20090701234</UserID><UserName>wangwu</UserName><Address>shanghai</Address></User><User><ID>4</ID><UserID>su20090912004</UserID><UserName>lisi</UserName><Address>beijing</Address></User><User><ID>5</ID><UserID>su20090912005</UserID><UserName>jialiu</UserName><Address>hebei</Address></User><User><ID>6</ID><UserID>su20090912007</UserID><UserName>qianlong</UserName><Address>zhejiang</Address></User></Users>
得到sql 返回的xml格式的数据,以前我的那个项目拼接成的xml格式的字符串就可以省去一大部分拼接代码。没有测试过是在程序这边拼接效率好还是数据库返回xml数据效率 好,但编写的程序代码是减少很多。有兴趣的同学帮忙测测这两种方式哪种效率更好些呢。欢迎大家扔砖头。
参考:
Using the FOR XML Clause to Return Query Results as XML
http://www.simple-talk.com/content/article.aspx?article=720
如何使用SQLSERVER2000中的XML功能
http://www.legalsoft.com.cn/docs/docs/11/1001.html
使用ExecuteXMLReader()读取XML片段
http://blog.csdn.net/sunhaiwei_andy/archive/2008/04/14/2289586.aspx
相关文章推荐
- 小议sql查询返回xml数据之应用
- sql查询返回xml数据之应用【转载】
- 小议sql查询返回xml数据之应用
- Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 1 -使用FOR XML返回XML结果集
- Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 1 -使用FOR XML返回XML结果集
- C#使用XmlDocument操作XML进行查询、增加、修改、删除、保存应用的实例(转载)
- Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 2 -使用XQuery 查询XML数据
- 多条查询sql语句返回多表数据集
- SQL应用与开发:(七)数据操作 · 查 · (三)使用子查询访问和修改数据
- SQL执行查询时出现返回数据为空的问题
- 工作日志之 SQL 存储过程返回XML数据集
- 使用原生sql查询数据返回object类型list时,转换数据列出现转换类型错误(但写法正确)
- 查询oracle数据库,返回的数据是乱码。 PL/SQL正常。
- SQL高级应用之使用SQL查询Excel表格数据的方法
- T-SQL 随机返回特定行数据和分页查询
- sql基础--怎样让查询出来的数据只返回多少行
- SQL查询返回数据多列,保存在list中时,怎么取值
- 转载 《Struts2返回JSON数据的具体应用范例》
- 工作日志之 SQL 存储过程返回XML数据集
- xml查询返回结果ResultXML格式(接着在VC中用CMarkup类查找XML-body的数据)