您所在的位置: 首页>>数据库>>SQL Server>>

使用 SQL Server 2005中的 CLR 集成(7)

http://database.51cto.com  2005-11-14 17:18    Microsoft  我要评论(0)
  • 摘要:本文描述了数据库应用程序开发人员和架构师如何利用 SQL Server 2005 中的 CLR 集成功能。本文对基于 CLR 的编程方式与 SQL Server 中支持的现有编程模型(如 TransacT-SQL 和扩展存储过程)进行了比较,并且强调了各自相对的优缺点。还提供了一组选择合适的编程替代方法的高级指导,以及一些示例和代码示例。
  • 标签:SQL  SQL Server  SQL Server 2005
将上面的示例改为返回来自 RSS 供给的信息,返回结果的代码如下所示(不包括未实现的方法):

[SqlFunction]
public static ISqlReader tvf1()
{
   return (ISqlReader)new RssReader();
}

public class RssReader : ISqlReader
{
   SqlMetaData[] rss_results = null;
   XPathDocument doc;
   XPathNavigator nav;
   XPathNodeIterator i;

   // Construct helper class, initializing metadata for the results
   // reading from the RSS feed, creating the iterator
   public RssReader()
   {
     rss_results = new SqlMetaData[4];
     rss_results[0] = new SqlMetaData("Title", SqlDbType.NVarChar, 250);
     rss_results[1] = new SqlMetaData("Publication Date", 
SqlDbType.DateTime);
     rss_results[2] = new SqlMetaData("Description", SqlDbType.NVarChar, 2000);
     rss_results[3] = new SqlMetaData("Link", SqlDbType.NVarChar, 1000);

     // Retrieve the RSS feed
     doc = new XPathDocument("http://msdn.microsoft.com/sql/rss.xml");
     nav = doc.CreateNavigator();
     i = nav.Select("//item");
   }

   // # of columns returned by the function
   public int FieldCount { get { return rss_results.Length; } }

   // metadata for each of the columns
   public SqlMetaData GetSqlMetaData(int FieldNo)
      { return rss_results[FieldNo]; }

   // Read method positions the navigator iterator on next element
   public bool Read() { return i.MoveNext(); }

   // methods to return each column
   public Object GetValue(int FieldNo) 
   {
      switch (FieldNo)
      {
         case 0:
            return new SqlString((string)                   
                   i.Current.Evaluate("string(title[1]/text())"));
         case 1:
            return new SqlDateTime(DateTime.Parse( 
                   
(string)i.Current.Evaluate("string(pubDate[1]/text())")));
         case 2:
            return new SqlString((string)
                   i.Current.Evaluate("string(description[1]/text())"));
         case 3:
            return new SqlString((string) 
                   i.Current.Evaluate("string(link[1]/text())"));
      }

      return null;
   }

   public string GetString(int i) { return (string)GetValue(i); }
   public DateTime GetDateTime(int i) { return (DateTime)GetValue(i); }
   public SqlChars GetSqlCharsRef(int i) { 
      return new SqlChars((SqlString)GetValue(i)); }
   public SqlChars GetSqlChars(int i) { 
      return new SqlChars((SqlString)GetValue(i)); }
   public SqlDateTime GetSqlDateTime(int i) { 
      return (SqlDateTime)GetValue(i); }
   ...
}

使用来自此表值函数的结果的一种简单查询如下所示:

select title, pubdate, description, link from dbo.GetRssFeed()

显然可以用此数据的 TVF 形式来表示更丰富的查询。假定函数 CanonicalURL() 会返回规范的 URL 版本。现在,可以使用规范的 URL 很容易地返回来自 RSS 供给的数据:

select title, pubdate, description, dbo.CanonicalURL(link) 
from dbo.tvf1()
order by pubdate


共12页: 上一页 [1] [2] [3] [4] [5] [6] 7 [8] [9] [10] [11] [12] 下一页
【内容导航】
深入SQL Server 2008
如何有效防御SQL注入攻击
Sun以10亿美元并购开源数据库厂商MySQL
Oracle数据库开发之PL/SQL基础应用
SQL Server 2008/2005全解
 
 验证码: (点击刷新验证码)   匿名发表
  • Visual C++ 6.0完全自学宝典

  • 作者:强锋科技,朱洪波
  • Visual C++ 6.0是微软公司为程序人员提供的Visual Studio 6.0工具套件中的重要组成部分。本书由浅入深地介绍使用Visual C++ 6.0..
Copyright©2005-2008 51CTO.COM 版权所有