SQL2005CLR函数扩展-天气服务
2009-05-14 23:40
323 查看
我们可以用CLR获取网络服务 来显示到数据库自定函数的结果集中,比如163的天气预报
http://news.163.com/xml/weather.xml
他的这个xml结果的日期是不正确的,但这个我们暂不讨论。
从这个xml获取天气的CLR代码如下,用WebClient访问一下就可以了。然后通过Dom对象遍历节点属性返回给结果集。
using
System;
using
System.Data;
using
System.Data.SqlClient;
using
System.Data.SqlTypes;
using
System.Collections;
using
System.Collections.Generic;
using
Microsoft.SqlServer.Server;
public
partial
class
UserDefinedFunctions
{
[SqlFunction
(TableDefinition = "city nvarchar(100),date nvarchar(100),general
nvarchar(100),temperature nvarchar(100),wind nvarchar(100)"
, Name =
"GetWeather"
, FillRowMethodName = "FillRow"
)]
public
static
IEnumerable
GetWeather()
{
System.Collections.Generic.List
<Item
> list = GetData();
return
list;
}
public
static
void
FillRow(Object
obj, out
SqlString
city, out
SqlString
date, out
SqlString
general, out
SqlString
temperature, out
SqlString
wind)
{
Item
data = (Item
)obj;
city = data.city;
date = data.date;
general = data.general;
temperature = data.temperature;
wind = data.wind;
}
class
Item
{
public
string
city;
public
string
date;
public
string
general;
public
string
temperature;
public
string
wind;
}
static
System.Collections.Generic.List
<Item
>
GetData()
{
System.Collections.Generic.List
<Item
> ret = new
List
<Item
>();
//try
//{
string
url = "http://news.163.com/xml/weather.xml"
;
System.Net.WebClient
wb = new
System.Net.WebClient
();
byte
[]
b = wb.DownloadData(url);
string
data = System.Text.Encoding
.Default.GetString(b);
System.Xml.XmlDocument
doc = new
System.Xml.XmlDocument
();
doc.LoadXml(data);
foreach
(System.Xml.XmlNode
node in
doc.ChildNodes[1])
{
string
city = GetXMLAttrib(node, "name"
);
foreach
(System.Xml.XmlNode
subnode in
node.ChildNodes)
{
Item
item = new
Item
();
item.city = city;
item.date =
GetXMLAttrib(subnode, "date"
);
item.general =
GetXMLAttrib(subnode, "general"
);
item.temperature =
GetXMLAttrib(subnode, "temperature"
);
item.wind =
GetXMLAttrib(subnode, "wind"
);
ret.Add(item);
}
}
//}
//catch(Exception ex)
//{
//
SqlContext.Pipe.Send(ex.Message);
//}
return
ret;
}
static
string
GetXMLAttrib(System.Xml.XmlNode
node, string
attrib)
{
try
{
return
node.Attributes[attrib].Value;
}
catch
{
return
string
.Empty;
}
}
};
部署这个clr函数的脚本如下
drop
function
dbo.
xfn_GetWeather
drop
ASSEMBLY
TestWeather
go
CREATE
ASSEMBLY
TestWeather FROM
'd:/sqlclr/TestWeather.dll'
WITH
PERMISSION_SET =
UnSAFE;
--
go
CREATE
FUNCTION
dbo.
xfn_GetWeather ()
RETURNS
table
(
city nvarchar
(
100),
date nvarchar
(
100),
general nvarchar
(
100),
temperature nvarchar
(
100),
wind nvarchar
(
100))
AS
EXTERNAL
NAME
TestWeather.
UserDefinedFunctions.
GetWeather
测试函数
select
*
from
dbo.
xfn_GetWeather
()
http://news.163.com/xml/weather.xml
他的这个xml结果的日期是不正确的,但这个我们暂不讨论。
从这个xml获取天气的CLR代码如下,用WebClient访问一下就可以了。然后通过Dom对象遍历节点属性返回给结果集。
using
System;
using
System.Data;
using
System.Data.SqlClient;
using
System.Data.SqlTypes;
using
System.Collections;
using
System.Collections.Generic;
using
Microsoft.SqlServer.Server;
public
partial
class
UserDefinedFunctions
{
[SqlFunction
(TableDefinition = "city nvarchar(100),date nvarchar(100),general
nvarchar(100),temperature nvarchar(100),wind nvarchar(100)"
, Name =
"GetWeather"
, FillRowMethodName = "FillRow"
)]
public
static
IEnumerable
GetWeather()
{
System.Collections.Generic.List
<Item
> list = GetData();
return
list;
}
public
static
void
FillRow(Object
obj, out
SqlString
city, out
SqlString
date, out
SqlString
general, out
SqlString
temperature, out
SqlString
wind)
{
Item
data = (Item
)obj;
city = data.city;
date = data.date;
general = data.general;
temperature = data.temperature;
wind = data.wind;
}
class
Item
{
public
string
city;
public
string
date;
public
string
general;
public
string
temperature;
public
string
wind;
}
static
System.Collections.Generic.List
<Item
>
GetData()
{
System.Collections.Generic.List
<Item
> ret = new
List
<Item
>();
//try
//{
string
url = "http://news.163.com/xml/weather.xml"
;
System.Net.WebClient
wb = new
System.Net.WebClient
();
byte
[]
b = wb.DownloadData(url);
string
data = System.Text.Encoding
.Default.GetString(b);
System.Xml.XmlDocument
doc = new
System.Xml.XmlDocument
();
doc.LoadXml(data);
foreach
(System.Xml.XmlNode
node in
doc.ChildNodes[1])
{
string
city = GetXMLAttrib(node, "name"
);
foreach
(System.Xml.XmlNode
subnode in
node.ChildNodes)
{
Item
item = new
Item
();
item.city = city;
item.date =
GetXMLAttrib(subnode, "date"
);
item.general =
GetXMLAttrib(subnode, "general"
);
item.temperature =
GetXMLAttrib(subnode, "temperature"
);
item.wind =
GetXMLAttrib(subnode, "wind"
);
ret.Add(item);
}
}
//}
//catch(Exception ex)
//{
//
SqlContext.Pipe.Send(ex.Message);
//}
return
ret;
}
static
string
GetXMLAttrib(System.Xml.XmlNode
node, string
attrib)
{
try
{
return
node.Attributes[attrib].Value;
}
catch
{
return
string
.Empty;
}
}
};
部署这个clr函数的脚本如下
drop
function
dbo.
xfn_GetWeather
drop
ASSEMBLY
TestWeather
go
CREATE
ASSEMBLY
TestWeather FROM
'd:/sqlclr/TestWeather.dll'
WITH
PERMISSION_SET =
UnSAFE;
--
go
CREATE
FUNCTION
dbo.
xfn_GetWeather ()
RETURNS
table
(
city nvarchar
(
100),
date nvarchar
(
100),
general nvarchar
(
100),
temperature nvarchar
(
100),
wind nvarchar
(
100))
AS
EXTERNAL
NAME
TestWeather.
UserDefinedFunctions.
GetWeather
测试函数
select
*
from
dbo.
xfn_GetWeather
()
相关文章推荐
- SQL2005CLR函数扩展-天气服务
- SQL2005CLR函数扩展-解析天气服务的实现
- SQL2005CLR函数扩展-环比计算
- SQL2005CLR函数扩展-树的结构
- SQL2005CLR函数扩展 - 关于山寨索引
- SQL2005CLR函数扩展-环比计算
- SQL2005CLR函数扩展-树的结构
- SQL2005CLR函数扩展-字符串函数
- SQL2005CLR函数扩展-字符串函数
- SQL2005CLR函数扩展-山寨索引
- SQL2005CLR函数扩展-数据导出
- SQL2005CLR函数扩展-正则表达式
- SQL2005CLR函数扩展-字符串函数
- SQL2005CLR函数扩展-繁简转换
- SQL2005CLR函数扩展-山寨索引
- SQL2005CLR函数扩展-正则表达式
- SQL2005CLR函数扩展-数据导出
- SQL2005CLR函数扩展-深入环比计算的详解
- SQL2005CLR函数扩展-数据导出
- SQL2005CLR函数扩展-繁简转换