在 x64 位 SQL Server 2005 中使用 32 位 COM DLL





0/5 (0投票)
在 x64 位 SQL Server 2005 中使用 32 位 COM DLL
引言
本文介绍了如何通过.NET CLR程序集和Web服务在64位SQL Server 2005实例中使用32位COM组件。
背景
以前我的应用程序运行在32位SQL Server 2000实例上,我们使用 Rijndael.dll (32位DLL) 通过xp_OA创建的扩展存储过程来加密/解密 string
。但是,当我们迁移到64位SQL Server实例时,Rijndael无法加载。
原因很明显,64位环境无法加载32位DLL。我们不能将此组件存储在数据中,因为数据是由此组件和加密/解密算法加密的,而且我们不能对该组件进行逆向工程。
在CLR程序集(SQL Server项目)中,我们不能使用任何外部DLL,除了属于.NET Framework的少数几个。您不能添加对任何外部程序集的引用。
我们只能通过asmx Web服务和WCF服务在CLR程序集中获得外部组件的服务。
所以我编写了一个CLR程序集和一个asmx Web服务。
为了在CLR程序集中加密/解密字符串,我们调用Web服务,Web服务再调用COM组件。
配置、步骤和代码讨论
首先创建一个Web服务,在此添加对COM组件的引用并公开Web方法。然后创建一个新的数据库项目。

将程序集的XML序列化设置为 true
,因为该程序集将访问作为外部组件的Web服务。

为了进行外部调用,我们应该拥有XML序列化的程序集。
现在创建一个新的 SqlProcedure
,它将调用Web服务。
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void EncryptString(string palinString)
{
//put webservice access code here
}
[Microsoft.SqlServer.Server.SqlProcedure]
public static void DecryptString(string encryptedString)
{
//put webservice access code here
}
}
现在构建 Sqlserverproject
。
部署
- 首先,我们需要通过执行以下命令来启用数据库CLR:
EXEC sp_configure 'show advanced options' , '1'; Go reconfigure; Go EXEC sp_configure 'clr enabled' , '1' Go reconfigure; Go
- 然后,我们必须设置数据库
TRUSTWORTHY
ALTER DATABASE <DB Name> SET TRUSTWORTHY ON
要部署CLR程序集,请打开SQL Server Management Studio,选择您想要的数据库,然后运行创建程序集命令。
首先部署 SqlServerProject1.dll 程序集。
从 C:\Documents and Settings\My Documents\Visual Studio 2008\Projects\CLRWebS\SqlServerProject1\bin\SqlServerProject1.dll 创建程序集 SqlServerProject1
。
WITH PERMISSION_SET = EXTERNAL
然后部署序列化的程序集 SqlServerProject1.XmlSerializers.dll。
从 C:\Documents and Settings\My Documents\Visual Studio 2008\Projects\CLRWebS\SqlServerProject1\bin\SqlServerProject1.XmlSerializers.dll 创建程序集 SqlServerProject1xml
。
WITH PERMISSION_SET = SAFE
测试
部署CLR后,将列出两个存储过程,现在您可以轻松地进行测试。

未来的增强
我们可以创建一个WCF服务并将其作为Windows服务托管,这样它将更加健壮并缩短访问时间。