程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL2005CLR函數擴展-解析天氣服務的實現

SQL2005CLR函數擴展-解析天氣服務的實現

編輯:關於SqlServer

    我們可以用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 ()

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved