由此CLR同步SQL Server和Sharepoint List数据(四)

形容以头里

    本系列文章共分为四部分:

        1. CLR概述。

        2. 于Visual Studio中展开CLR集成编程并配置及SQL
Server,包括仓储过程、触发器、自定义函数、自定义类型以及聚众。

        3. CLR集成编程的调节以及所碰到的题材。

        4. 动CLR同步SQL Server表和Sharepoint
List(来源于实际项目以)。

 

    本系列文章建立于偏下软件条件之根基及:

  • Windows Server 2003 Enterprise Edition Service Pack 2
  • Microsoft Visual Studio Team System 2008
  • Microsoft SQL Server 2008
  • Microsoft Office Sharepoint Server 2007

 

背景

    先说说怎么要拓展SQL Server和Sharepoint
List的数码并,这是一个事实上项目之运。

   
客户的Sharepoint站点上享有四个List,相互之间组成了一个装有层次结构的Organization数据,该数额最终自由另外一个网所用的数据库被的一个说明。在列之早期,开发人员手动从数据库中将数据导出来,然后导入到Sharepoint站点已创造好的List中;项目之后期,源数据库被的数目有了转移,于是开发人员需要手动检查这些多少的生成,并伙同到Sharepoint
List中。因为数据量比较坏,这项工作颇耗费人力和生命力,于是,我们打算于SQL
Server中修一个存储过程,并加加至SQL Server的计划任务中,让SQL
Server在一个周期被活动去联合这些数量。因为涉及到Sharepoint站点和List的访问同权限的决定,我们想到了当SQL
Server中采用CLR方法来编排存储过程并进行配置。以下是即时四独List的组织以及数据源的截图。

Area List

   
两单text类型的字段,Title和Area_Code,Title是Area的名称,Area_Code是Area的地区编码。

SQL Server 1

Region List

    Title:text类型,Region的名称。

    Area:Loopup类型,指向Area的ID。

    Region_Code:text类型,Region的编码。

SQL Server 2

 

 Country List

    Title:text类型,Country的名称。

    Region:Lookup类型,指向Region的ID。

    Country_Code:text类型,Country的编码。

SQL Server 3

 

CompanyCode List

    CompanyName:text类型,Company的名称。

    CompanyCode:Company的编码。

    Country:Lookup类型,指向Country的ID。

SQL Server 4

 

数据库中之源表

    将层次关系做以一个表中,Area_Code和Area_Name对应Area
List,Region_Code和RegionName对应Region
List,SubRegion_Code和SubRegion_Name对应Country
List,Company_Code和Company_Name对应CompanyCode List。

SQL Server 5

 

 

备干活

   
我们事先要在一个测试环境中开展编码测试,然后又配置及生育环境达标。先以测试服务器上新建一个空白Sharepoint站点,然后照点的叙说创建四独List,再打客户之服务器上将数据导入到测试用的数据库中。创建List的时候注意字段的名号,重新修改名称会招List字段的里名称与外部名称不一样,这在后头编写并程序的时要注意一下。

    打开Visual Studio,创建一个SQL Server
Project工程,取名为SqlClrSharePointSynchronizer,接下去便起来我们的联合程序编码啦。

 

开始

   
程序要形成两组成部分的干活,先连接到数据源所在的数据库,取到数,然后连到如拓展数据并的Sharepoint站点,最后调用WSS提供的计以数据勾勒及对应的List中。考虑到所编的次序是内需安排及宿主数据库中才会实施的,首先要考虑的问题是以什么艺术实行顺序。因为程序所形成的功效相对较独立,不借助于让数据库被的其余对象(如表、视图等),比较出色的道就是是储存过程以及自定义函数,而自从定义函数又分为Scale函数和TVF函数两种(在面前的稿子被既介绍过),Scale函数适用于对数据的拍卖,类似于一个数据处理工具函数,用在此处肯定不合适,而TVF函数需要指定一个当的输出表结构,况且我们的顺序只是水到渠成一个数额并过程,输出的信或略到只有成功还是失败这样简单的文字,所以啊非欲TVF函数。另外,自定义函数是必须要起返回值的,这也可能未是我们所需要的。那么存储过程是极端适当的挑三拣四了,于是我们先修好一个名吧Synchronizer的好像以及一个public
static方法SyncHierarchy,来表示一个数据库的贮存过程。

   
接下的做事是若把基础工作做好,一个DBUtil类,用来拍卖数据库连接和获取数据,这个以大部老三叠结构的ASP.NET程序开发中都发,没什么好说的,只是自己以此间不需要它形成还多之功效,只需要执行SQL语句并赶回一个填写充好数据的DataSet即可,其余的方法都给删掉了。读者在附件面临得看来是简单的切近,这里我不怕不再另行贴发出代码了。

   
重要的是索要以工程被运用WSS提供的计。我们以工程被援Sharepoint站点提供的Web服务,它的地点是http://SiteName/\_vti\_bin/lists.asmx,其中SiteName就是Sharepoint站点的地点。将这Web引用取名为Lists,修改代理类如下:

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SqlServer.Server;
using System.Security.Principal;
using System.Net;

namespace SqlClrSharePointSynchronizer.Lists
{
    public partial class Lists
    {
        public WindowsImpersonationContext impersonationContext;

        public Lists(string siteUrl, bool impersonateCaller, IWebProxy proxy)
            : this()
        {
            if (siteUrl.EndsWith(@”/”))
            {
                siteUrl = siteUrl + “_vti_bin/Lists.asmx”;
            }
            else
            {
                siteUrl = siteUrl + “/_vti_bin/Lists.asmx”;
            }

            if (impersonateCaller)
            {
                this.impersonationContext = SqlContext.WindowsIdentity.Impersonate();
            }

            this.Url = siteUrl;
            this.Credentials = CredentialCache.DefaultCredentials;
            //this.Credentials = new NetworkCredential(“uid”, “pwd”, “domain”);

            if (proxy != null)
            {
                this.Proxy = proxy;
            }

        }

        protected override void Dispose(bool disposing)
        {
            if (disposing && impersonationContext != null)
            {
                impersonationContext.Undo();
            }
            base.Dispose(disposing);
        }
    }
}

    主要作用是提升程序访问Sharepoint
List时的权力,该权限行使SqlContext对象通过SQL
Server宿主程序的当下登录帐户去学,记住权限提升后要履行Undo操作,这个是呼应的!

    核心部分的代码在SPListUtil类中成功,主要实现调用Web
Service和施行更新SPList的主意。主要使用到了一定量只Web
Service方法,Lists.GetListItems()和Lists.UpdateListItems()。有一个内需专注的地方,SPList中发生Lookup类型的字段,这就是需要我们当更新数据的上以这种字段的价写成1;#Title1;#2;#Title2的形式,这个得协调在先后中失处理。还有就是是当一次性更新的数据量比较坏时,执行Lists.UpdateListItems()方法时所用的CAML会让机关截断,这个自一度以《下WSS的Lists.UpdateListItems()方法的于截断的CAML
》一平和被被出了解决办法。

   
具体的代码读者可以拘留本身于本文后面给来的附件。我通过四条SQL语句从数量源表中读取数据并填写充到DataSet中,然后逐一以及时四组成部分数据开展转移并更新到相应之SPList中,同时输出Lists.UpdateListItems()方法的返信息,该信息是平等截XML文本,包含了履行CAML更新数据经常的详细情况,在FormatResult()方法被开展格式化,将赶回信息格式化为我们盼望之指南。下面是自家当次中应用的用来取多少的SQL语句。

string SELECT_AREA = “Select Distinct AREA_NAME, AREA_CODE From {0}dbo.SECCompanyHierarchy Where AREA_NAME <> ””;
string SELECT_REGION = “Select Distinct REGION_NAME, AREA_CODE, REGION_CODE From {0}dbo.SECCompanyHierarchy Where REGION_NAME <> ””;
string SELECT_COUNTRY = “Select Distinct SUBREGION_NAME, REGION_CODE, SUBREGION_CODE From {0}dbo.SECCompanyHierarchy Where SUBREGION_NAME <> ””;
string SELECT_COMPANYCODE = “Select COMPANY_CODE, COMPANY_NAME, SUBREGION_CODE From {0}dbo.SECCompanyHierarchy Where COMPANY_CODE <> ” And COMPANY_NAME <> ””;

    
因为考虑到宿主数据库被恐怕会见动LinkedServers方式连接客户数据库服务器,所以使用了这种方式的SQL语句。其它的地方应当都异常好明,读者看源代码就OK了。

   
最后说一样生安排。按照自己当眼前几篇稿子中牵线的布局方式就得就dll在宿主数据库服务器上的配置,Visual
Studio中一直以档次文件上点击右键,点Deploy就得活动部署,一般景象下活动部署不会见起什么问题,但是咱总会遇到将编译好之dll部署及正规的服务器上的问题,读者可看自己于第三篇文章被为闹的异常手动部署之SQL脚本的事例。部署成功后,在SQL
Server查询分析器中履行,下面是实践进程的截图。 

 

 

SQL Server 6

 

   
存储过程的率先只参数为一定了数码并的目的地址,第二单参数是LinkedServers的名号,如果数据库就当本地的宿主服务器上,则无需要指定第二单参数。同时Messages窗口中为受起了经格式化后底推行结果。

代码示例下载

 

结语

    通过四首文章介绍了SQL
CLR编程的背景、示例、调试和部署,以及实际用之例子,希望对正在使用或前见面利用SQL
CLR的冤家有帮助,同时也也友好随后用SQL CLR编程开发做一个笔录。

1 2 3 4

相关文章