ACCESS由此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已经深受入选。


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

 

下测试脚本调试

    除了上面介绍的点子外,还可当Visual
Studio中行使测试脚论进行代码调试。

    在Solution Explorer窗口中,打开Test
Scripts目录下的Test.sql文件,该公文是Visual
Studio在工程被自动创建的专门用来测试SQL脚本的。将尽SQL的口舌写以中,代码中安装好断点,直接点击F5,Visual
Studio就会见根据你写的SQL脚论实施,并自动命中断点进行调节。当然,也可于Test.sql文件上单击右键,选择Debug
Script手动启动调试。

   
另外,还可自己编辑应用程序对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

相关文章