写在日前

    本连串作品一共分成四局地:

        1. CLR概述。

        2. 在Visual Studio中开始展览CL翼虎集成编制程序并配置到SQL
Server,包蕴仓库储存进程、触发器、自定义函数、自定义类型和集合。

        3. CL牧马人集成编制程序的调剂和所际遇的题材。

        4. 应用CL锐界同步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的多寡同步,那是1个实际上项目标利用。

   
客户的Sharepoint站点上存有八个List,互相之间组成了一个富有层次结构的Organization数据,该数额最后来自由此外三个系统所使用的数据库中的2个表。在档次的最初,开发人士手动从数据库元帅数据导出来,然后导入到Sharepoint站点已创设好的List中;项指标末尾,源数据库中的数据暴发了变化,于是开发职员要求手动物检疫查这几个数量的转移,并一同到Sharepoint
List中。因为数据量相比较大,那项工作很花费人力和生命力,于是,大家打算在SQL
Server中编辑三个囤积进程,并添加到SQL Server的计划义务中,让SQL
Server在3个周期中活动去联合这几个数据。因为涉嫌到Sharepoint站点和List的访问以及权限的支配,大家想到了在SQL
Server中应用CLTiguan方法来编排存款和储蓄进度并展开计划。以下是那七个List的组织和数据源的截图。

Area List

   
七个text类型的字段,Title和Area_Code,Title是Area的名称,Area_Code是Area的地段编码。

XML 1

Region List

    Title:text类型,Region的名称。

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

    Region_Code:text类型,Region的编码。

XML 2

 

 Country List

    Title:text类型,Country的名称。

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

    Country_Code:text类型,Country的编码。

XML 3

 

CompanyCode List

    CompanyName:text类型,Company的名称。

    CompanyCode:Company的编码。

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

XML 4

 

数据库中的源表

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

XML 5

 

 

防微杜渐干活

   
大家先行供给在二个测试环境中展开编码测试,然后再配备到生育环境上。先在测试服务器上新建3个空白Sharepoint站点,然后遵照地方的叙说创设多少个List,再从客户的服务器元帅数据导入到测试用的数据库中。创立List的时候注意字段的称呼,重新修改名称会导致List字段的中间名称和外部名称分裂等,那在前面编写同步程序的时候供给专注一下。

    打开Visual Studio,创制贰个SQL Server
Project工程,取名为SqlClrSharePointSynchronizer,接下去就起来大家的共同程序编码啦。

 

开始

   
程序首要成就两局地的干活,先连接到数据源所在的数据库,取到数据,然后连接到要开始展览多少同步的Sharepoint站点,最终调用WSS提供的措施将数据写到对应的List中。考虑到所编纂的主次是供给安顿到宿主数据库中才能执行的,首先要考虑的难题是行使什么措施履行顺序。因为程序所形成的功力相对比较独立,不依靠于数据库中的其余对象(如表、视图等),比较不错的艺术正是储存进度和自定义函数,而自定义函数又分为Scale函数和TVF函数三种(在前边的小说中一度介绍过),Scale函数适用于对数码的拍卖,类似于多个数额处理工科具函数,用在此地肯定不合适,而TVF函数须要钦命一个极度的输出表结构,况且大家的次第只是完成3个数码同步进程,输出的音信恐怕不难到唯有成功或破产那样简单的文字,所以也不须要TVF函数。别的,自定义函数是必须要有重返值的,那也可能不是大家所必要的。那么存款和储蓄进程是最合适的抉择了,于是大家先建好二个名为Synchronizer的类和2个public
static方法SyncHierarchy,来代表1个数据库的贮存进程。

   
接下去的做事是要把基础工作搞好,二个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()。有2个急需注意的地方,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安排到正式的服务器上的题材,读者能够看看自家在第2篇作品中提交的相当手动安插的SQL脚本的例证。安顿成功后,在SQL
Server查询分析器中履行,上面是进行进度的截图。 

 

 

XML 6

 

   
存款和储蓄进程的第①个参数给定了数据同步的指标地址,第②个参数是LinkedServers的称呼,如若数据库就在地头的宿主服务器上,则不必要钦定第二个参数。同时Messages窗口中也交给了经过格式化后的推行结果。

代码示例下载

 

结语

    通过四篇小说介绍了SQL
CL哈弗编程的背景、示例、调试和配置,以及实际运用的例子,希望对正值采纳或今后会动用SQL
CLTucson的对象有所支持,同时也为和谐从此选取SQL CL君越编制程序开发做八个笔录。

1 2 3 4

相关文章

网站地图xml地图