通过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

 

CLR集成编程的调剂

    前边已经涉及了在Visual Studio中举办SQL CLR集成编程开发,同时Visual
Studio也都提供了对CLR集成编程的调节,使支付尤其便捷,下边介绍两种具体的调试方法。

在Server Explorer窗口中使用单步调试

    1. 在Visual Studio中打开SQL
CLR工程,打开cs文件并在您想调试的代码上安装断点,此时Visual
Studio会指示您是否同意SQL CLR举行调节,点击“是”。同时,在Server
Explorer窗口中,右键单击已一连的数据库节点,会晤到Application
Debugging和Allow SQL/CLR Debugging已经被选中。

图片 1
图片 2

    2. 在Server
Explorer窗口中,打开已连续的数据库节点,找到已安排成功的数据库类型(存储过程、函数、触发器等),单击右键接纳Step
Into Function。此时Visual
Studio会自动先导实施该办法并命中断点起初调剂。注意,采用该调试方法前务必先编译并配备程序集到指定的SQL
Server上,否则在Server Explorer窗口旅长找不到刚成立的品类。

图片 3

 

利用测试脚本调试

    除了下面介绍的点子外,还足以在Visual
Studio中行使测试脚本举办代码调试。

    在Solution Explorer窗口中,打开Test
Scripts目录下的Test.sql文件,该公文是Visual
Studio在工程中自动创设的特别用于测试SQL脚本的。将履行SQL的言语写在其中,代码中装置好断点,直接点击F5,Visual
Studio就会基于你写的SQL脚本实施,并自动命中断点举办调节。当然,也足以在Test.sql文件上单击右键,采纳Debug
Script手动启动调试。

图片 4   
此外,还足以协调编辑应用程序对SQL
CLR集成编程举办调节,不过对此简易和少量的代码就从未必要了。还有一些亟待注意,调试前务必设置断点,SQL
CLR集成编程中代码一旦出现谬误会活动跳出,而不指向出错的代码行,但在SQL
Server端执行的时候CLR如故会交到错误内容的。

 

CLR集成编程中遭逢的问题

    1. 当CLR程序集需要拜访外部资源时务必将次第集的性能Permission
Level的值设置为External,有的时候恐怕会遭受上面这样的谬误提醒。并且一度将Permission
Level的值设置成External,而且数据库也将Trustworthy打开了。

Msg 10314, Level 16, State 11, Line 2
An error occurred in the Microsoft .NET Framework while trying to load
assembly id 65536. The server may be running out of resources, or the
assembly may not be trusted with PERMISSION_SET = EXTERNAL_ACCESS or
UNSAFE. Run the query again, or check documentation to see how to solve
the assembly trust issues. For more information about this error:
System.IO.FileLoadException: Could not load file or assembly
‘AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null’ or
one of its dependencies. An error relating to security occurred.
(Exception from HRESULT: 0x8013150A) System.IO.FileLoadException:
at System.Reflection.Assembly.nLoad(AssemblyName fileName, String
codeBase, Evidence assemblySecurity, Assembly locationHint,
StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean
forIntrospection)
at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef,
Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean
forIntrospection)
at System.Reflection.Assembly.InternalLoad(String assemblyString,
Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean
forIntrospection)
at System.Reflection.Assembly.Load(String assemblyString)

或者

Server: Msg 10327, Level 14, State 1, Line 1
CREATE ASSEMBLY for assembly ‘AssemblyName’ failed because assembly
‘AssemblyName’ is not authorized for PERMISSION_SET = EXTERNAL_ACCESS.
The assembly is authorized when either of the following is true: the
database owner (DBO) has EXTERNAL ACCESS ASSEMBLY permission and the
database has the TRUSTWORTHY database property on; or the assembly is
signed with a certificate or an asymmetric key that has a corresponding
login with EXTERNAL ACCESS ASSEMBLY permission.

    暴发该问题的原委或许是您登录当前SQL
Server的账户尚未权力访问相应的资源,切换来SQL Server管理员账户即可。

USE <DatabaseName>
GO
EXEC sp_changedbowner ‘sa’

    2.
CLR中多少访问被驳回,即便采纳了SqlContext上下文举办数据库连接,或者指定了不利的数据库连接字符串。

A .NET Framework error occurred during execution of user defined routine
or aggregate ‘p_TESTNAME’: System.Data.SqlClient.SqlException: Login
failed for user ‘NT AUTHORITY\NETWORK SERVICE’.

    大部分时候你可能会接纳NT账户去老是SQL Server而不是SQl
Server服务账户,这时就需要在代码中应用SqlContext.WindowsIndentity属性,上面的代码片段表明了怎么样运用这些特性。

1 public static void
p_TESTNAME()
2     {
3         WindowsIdentity newId = new
SqlContect.WindowsIdentity;
4         WindowsImpersinationContext
impersonatedUser = newId.Impersonate();

6         try
7     { 
8         using
(SqlConnection conn = new
SqlConnection(“Server=RemoteServer;Integrated Security=true”))
9         {
10         conn.Open();
11         //Do
something…
12         conn.Close();
13         }
14         }
15     finally
16     {
17         impersonatedUser.Undo();
18     }
19     }
20 

   
impersonatedUser.Undo()方法必须举办(无论怎么情形下)。当使用SqlContext上下文的法门开展连续时必须在该方法成功之后,否则会现出连续失败的失实,这不仅仅是在采取SqlContext举办数据库连接时,在行使SqlContext.Pipe方法时也是这么。所以,务必确认在Undo方法成功之后,再调用SqlContext对象。

    3.
部分时候在CLR的宿主服务器A上需要拜访此外一个数据库服务器B,而B拔取的Windows身份验证,这时可以在A中开创一个Linked
Servers,用来指向B,使用的时候在数据库对象前增长Linked
Servers名称和数据库名称,即:

<LinkedServers>.<DBName>.<[dbo].TableName>

   
因为不可能间接拔取SqlContext在A中访问B,通过给定数据库连接字符串也不可以成功在A中访问B,采纳Linked
Servers方法可以很好地解决这些题目。有关如何创设Linked
Servers,读者可以参见SQL Server的襄助文档。

http://msdn.microsoft.com/zh-cn/library/ms162234(SQL.90).aspx

    4.
在举办CLR集成开发时有时会扭转附属程序集,如*.XmlSerializers.dll,部署的时候需要将配属程序集与主程序集一同部署,先安排主程序集,后安排附属程序集。删除的时候先删除附属程序集,后删除主程序集。

    使用SQL
CLR的经过中可能还会遇见很多意料之外的题材,我在档次中接纳CLR时就赶上了无数不三不四的题目,通过查帮忙文档和Google,后来问题着力都解决了。未来实际使用中再相见题目再补上,近来只想到这般多了
🙂 下边顺便给出一个手动部署dll到SQL
Server服务器的剧本,方便我们将调试好的dll部署到生产环境中。

 

CLR集成编程的部署

    下边是手动将先后集部署到SQL
Server的一个演示,通过该示例,可以援救读者精通什么将顺序集部署到SQL
Server服务器上。

1 –exec
sp_configure ‘clr enabled’, 1
2 –reconfigure
with override
3 –ALTER
DATABASE TEST SET trustworthy ON
4 –use
TEST
5 –go
6 –Exec
sp_changedbowner ‘sa’

8 –Dropping
Everything
9 if OBJECT_ID(‘dbo.SyncHierarchy’)
is not null
10 begin
11    print ‘dropping
procedure dbo.SyncHierarchy’
12    drop procedure
dbo.SyncHierarchy
13 end
14 IF EXISTS
(SELECT [name] FROM
sys.assemblies WHERE [name] =
N’SqlClrSharePointSynchronizerXML’)
15 begin
16    print ‘dropping
assembly SqlClrSharePointSynchronizerXML’
17    DROP ASSEMBLY
SqlClrSharePointSynchronizerXML with NO
DEPENDENTS;
18 end
19 IF EXISTS
(SELECT [name] FROM
sys.assemblies WHERE [name] =
N’SqlClrSharePointSynchronizer’)
20 begin
21    print ‘dropping
assembly SqlClrSharePointSynchronizer’
22    DROP ASSEMBLY
SqlClrSharePointSynchronizer with NO
DEPENDENTS;
23 end
24 go
25 
26 –creating
everything
27 declare @path nvarchar(1000)
28 set @path = ‘E:\Import\SqlClrSharePointSynchronizer\SqlClrSharePointSynchronizer\bin\Debug\’
29 print ‘creating
assembly SqlClrSharePointSynchronizer’
30 exec
(‘CREATE ASSEMBLY [SqlClrSharePointSynchronizer]
FROM ”’ + @path + ‘SqlClrSharePointSynchronizer.dll”
31 WITH PERMISSION_SET =
EXTERNAL_ACCESS’)
32 
33 print ‘creating
assembly SqlClrSharePointSynchronizerXML’
34 exec
(‘CREATE ASSEMBLY
[SqlClrSharePointSynchronizerXML] FROM ”’ + @path + ‘SqlClrSharePointSynchronizer.XmlSerializers.dll”
35 WITH PERMISSION_SET =
EXTERNAL_ACCESS’)
36 go
37 
38 
39 CREATE PROCEDURE [dbo].[SyncHierarchy]
40     @siteUrl [nvarchar](4000),
41     @linkServer [nvarchar](4000)
42 WITH EXECUTE AS CALLER
43 AS
44 EXTERNAL NAME [SqlClrSharePointSynchronizer].[Synchronizer].[SyncHierarchy]
45 GO

 

结语

    本篇介绍了CLR集成编程在Visual
Studio中的代码调试,以及运行和配置过程中碰到的一对题目,和对CLR集成编程中dll的手动部署,下一篇将向我们介绍一个SQL
CLR在其实使用中的例子——怎么着通过CLR同步SQL Server与Sharepoint List数据。

1 2 3 4

相关文章