由此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的地方编码。

图片 1

Region List

    Title:text类型,Region的名称。

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

    Region_Code:text类型,Region的编码。

图片 2

 

 Country List

    Title:text类型,Country的名称。

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

    Country_Code:text类型,Country的编码。

图片 3

 

CompanyCode List

    CompanyName:text类型,Company的名称。

    CompanyCode:Company的编码。

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

图片 4

 

数据库中的源表

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

图片 5

 

 

准备干活

   
我们先行须求在一个测试环境中进行编码测试,然后再配置到生育环境上。先在测试服务器上新建一个空白Sharepoint站点,然后按照上边的叙述创立八个List,再从客户的服务器少校数据导入到测试用的数据库中。成立List的时候注意字段的名号,重新修改名称会造成List字段的内部名称和表面名称差距,那在背后编写同步程序的时候须求留意一下。

    打开Visual Studio,创立一个SQL Server
Project工程,取名为SqlClrSharePointSynchronizer,接下去就从头大家的同步程序编码啦。

 

开始

   
程序主要已毕两片段的做事,先连接到数据源所在的数据库,取到数据,然后连接到要拓展数量同步的Sharepoint站点,最后调用WSS提供的主意将数据写到对应的List中。考虑到所编写的主次是急需计划到宿主数据库中才能执行的,首先要考虑的标题是运用什么点子履行顺序。因为程序所形成的法力绝对相比独立,不借助于于数据库中的其余对象(如表、视图等),相比可观的点子就是储存进度和自定义函数,而自定义函数又分为Scale函数和电视F函数二种(在头里的篇章中一度介绍过),Scale函数适用于对数据的处理,类似于一个数量处理工具函数,用在此地肯定不合适,而电视F函数要求指定一个正好的输出表结构,况且我们的先后只是形成一个多少同步进度,输出的信息可能简单到唯有成功或失利那样概括的文字,所以也不要求电视F函数。其余,自定义函数是必须求有再次回到值的,那也可能不是我们所需求的。那么存储进程是最合适的取舍了,于是大家先建好一个名为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
瑟维斯和履行更新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查询分析器中施行,上面是实施进程的截图。 

 

 

图片 6

 

   
存储进程的率先个参数给定了数码同步的目标地址,第一个参数是LinkedServers的称谓,倘诺数据库就在地头的宿主服务器上,则不需求指定首个参数。同时Messages窗口中也提交了通过格式化后的推行结果。

代码示例下载

 

结语

    通过四篇文章介绍了SQL
CLR编程的背景、示例、调试和配备,以及实际行使的例证,希望对正值拔取或将来会使用SQL
CLR的情人有所协理,同时也为祥和之后利用SQL CLR编程开发做一个记下。

1 2 3 4

相关文章