SQL Server调用DLL

下面描述一个场景,你用SSRS报表通过存储过程或者SQL语句来获取数据进而输出报表,如果,你的报表上面需要有个二维码,该如何实现?答案当然可以有很多种,生成实体图片,链接动态给入?或者是将图片转成流存进数据库,报表读取的时候取出来?这些办法当然都可以。下面是我的办法,在C#里面去做生成二维码转成流的动作,然后打包成DLL,在数据库中将DLL导入,建立数据库的Function,然后在生成报表的时候能直接像一个数据库的字段一样直接Select出来,中间不需要在数据库服务器存在任何的图片文件。在C# 里面写代码生成二维码的方式有很多,我是用Zixing.dll,这里就不细说了,重点是后面的如何将DLL引入数据库。

数据库服务器准备工作
1.启用CLR

exec  sp_configure  'clr enabled' , 1 
reconfigure

2.设置信任程序集(如果有还原数据库也要重新执行)

ALTER DATABASE  数据库名 SET TRUSTWORTHY ON 

假定,你已经有打包生成好的DLL,你需要把所有依赖的DLL放在同一个文件夹里,然后准备上传到数据库服务器上。那么有两种方法可以导入DLL。
1.鼠标点击法
SQL Server调用DLL_第1张图片
注意这里导入的时候权限集先选安全的,后面改成其他的,下面是三者的区别。
安全(它只能通过进程中的托管提供程序在服务器内执行计算和数据访问)
外部访问(适用于代码需要访问服务器之外的资源(如文件、网络、注册表和环境变量))
不安全(程序集并非可验证为安全的,或程序集要求进一步访问受限资源(如 Microsoft Win32 API))

2.代码导入法
create assembly 自定义名称 from ‘DLL路径’
如果有依赖的DLL,导入你自己的DLL即可,依赖会自行加载。

DLL引入数据库并不一定就能这么轻松解决,以下是一些可能会碰到的问题,以及一些注意事项。

下面有几点需要注意的。
1.最终在数据库中调用的DLL里面的方法应该是static的。
2.如果开发机上.net版本跟服务器(服务器一般旧一点.Net 4.5,而开发机一般较新4.8)不一样,取服务器C盘.net安装包下的原System的dll拿到客户端重新编译之后重新挂上服务器,这种方法适用于当前C盘最新.net版本下的DLL正是系统正在使用的。
3.如果导入的是系统的基本DLL(System.Draw之类的),数据库会要求必须导最新版本的DLL,但是最新版本的DLL不一定跟系统本机的GAC的程序集的版本一样。
到该地址下载最新版本的DLL
DLL下载地址
那样导入之后可能还会继续报错,主机存储区中的程序集与 GAC 中的程序集具有不同的签名
这是因为C盘的Windows的DLL缓存版本,简称GAC,跟你将要使用的DLL版本不一致。
这时候将可以使用的合适版本的DLL一个一个导入SQL(上面的鼠标点击法),而且导入的时候要指定导入DLL的来源路径。最后导入自己实际使用的那个DLL。这样数据库系统在加载DLL的时候会优先加载你导入的那部分DLL。
4.如果上面的方法还不能解决问题,用终极的解决办法,在目标服务器上安装Visual Studio,建立新项目,然后引用C:\Windows\Microsoft.NET\Framework 下.Net Framework目标版本的DLL去编译生成,一定能在该服务器上运行导入。

在DLL导入成功之后,可以尝试着开始使用它,写一个Function去调用一下。例如:

CREATE FUNCTION [dbo].[f_QRGenerateByte](@text [nvarchar](500))
RETURNS [varbinary](8000) WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [DataMatrilX].[DataMatrilX.DataMatrilX].[GenerateDatamatrilX]

然后测试。

select f_QRGenerateByte("二维码信息")

能出来一串流的数据,就可以引入SSRS的报表里面去尝试,在报表图片的来源选数据库字段即可。

你可能感兴趣的:(SQLServer,sqlserver,dll)