通过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已经于选中。

SQL Server 1
SQL Server 2

    2. 当Server
Explorer窗口中,打开都连续的数据库节点,找到已经安排成功的数据库类型(存储过程、函数、触发器等),单击右键选择Step
Into Function。此时Visual
Studio会自动开施行该法并命中断点开始调试。注意,采用该调试方法前须事先编译并安排程序集至指定的SQL
Server上,否则在Server Explorer窗口中将找不至刚创立的类。

SQL Server 3

 

动测试脚本调试

    除了上面介绍的措施外,还得以Visual
Studio中以测试脚论进行代码调试。

    在Solution Explorer窗口中,打开Test
Scripts目录下之Test.sql文件,该文件是Visual
Studio在工程中自行创建的特别用于测试SQL脚本的。将执SQL的话语写以里面,代码中安好断点,直接点击F5,Visual
Studio就会见根据你勾勒的SQL脚论实施,并自动命中断点进行调剂。当然,也得以以Test.sql文件上单击右键,选择Debug
Script手动启动调试。

SQL Server 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

相关文章