SQL调用C# dll(第一中DLL,没使用强名称密匙,默认是 safe)

https://msdn.microsoft.com/zh-cn/library/ms345106(es-es).aspx

1、新建项目名称SQLDllTest,类代码如下,没有用Using引用其他类:

       (框架必须改为.NET3.5及3.5以下,因为SQL Server 2008只是支持.NET 3.5及一下,.NET 4.0是2010年发布的,不支持也很正常)

复制代码
namespace SQLDllTest
{
    public class Class1
    {
        public static string GetStr(string par1)
        {
            return par1 + "水印";
        }
    }
}
复制代码

2、第二步:直接使用SQL语句创建程序集

  

create assembly TestDll from 'D:\SQLDllTest.dll'

3、第三步:

创建一个Function,使用该dll文件

         使用如下SQL语句

复制代码
CREATE FUNCTION dbo.GetStr  
(
     @InputString as nvarchar(500)
)
RETURNS nvarchar(200)
AS EXTERNAL NAME TestDll.[SQLDllTest.Class1].GetStr
复制代码

注意一下标红的那几个单词。

TestDll是指你程序集中dll的名称。

SQLDllTest是指dll文件中那个类的命名空间。

Class1是指dll文件中那个类的类名。

GetStr是指dll文件中那个被调用的静态方法。

4、第四步:开启 clr

  

复制代码
exec sp_configure 'show advanced options', '1';
go
reconfigure;
go
exec sp_configure 'clr enabled', '1'
go
reconfigure;
exec sp_configure 'show advanced options', '1';
go
复制代码

 

 

5、第五步:执行方法:

select dbo.GetStr('hahha') as col1

返回: hahha水印

 

 

SQL调用C# dll(第二中DLL,强名称密匙)

参考:微软官网 https://msdn.microsoft.com/zh-cn/library/ms345106(es-es).aspx

1、新建项目 SQLDllTestUsingNew

  Class1类代码:

     

复制代码
using System.Web;
namespace SQLDllTestUsingNew
{
    public class Class1
    {
        public static string GetStr(string par1)
        {
            return par1 + "水印New";
        }
    }
}
复制代码

2、类库项目进行签名,签名后编译【项目】:

 

3、启用CLR功能:默认情况下,Sql Server中的CLR是关闭的,

 

exec sp_configure 'clr enabled',1  
reconfigure  
go

4、

注册DLL:

为了调用我们写的那个方法,需要在SQL Server中注册我们刚刚编译好的那个DLL。在此之前,要知道在这个项目中如果要访问服务器之外的资源是要配置权限的。如果不配置,后面操作中会出现类似下面的错误。我找到的关于授权配置的内容:连接

创建登录名和密钥,如果程序集有变更,要删除密钥和登录名重新创建:

复制代码
USE master; --此处必须是 master库
GO  
 
CREATE ASYMMETRIC KEY SQLCLRSyncKey FROM EXECUTABLE FILE = 'D:\SQLDllTestUsingNew.dll'  
CREATE LOGIN SQLCLRSyncLogin FROM ASYMMETRIC KEY SQLCLRSyncKey   
GRANT EXTERNAL ACCESS ASSEMBLY TO SQLCLRSyncLogin;
GRANT UNSAFE ASSEMBLY TO SQLCLRSyncLogin 
复制代码

创建程序集,DLL变更后要删除重新创建代码如下:

DROP LOGIN SQLCLRSyncLogin
DROP ASYMMETRIC KEY SQLCLRSyncKey

5、创建程序集,DLL变更后要删除重新创建:

复制代码
use TestDB
go

create ASSEMBLY MySync 
FROM 'D:\SQLDllTestUsingNew.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS;

如果提示错误:Msg 6522, Level 16, State 1, procedure InsertingRows,Line 0
A .NET Framework error occurred during execution of user defined routine or aggregate 'InsertingRows':
System.Security.SecurityException

改成:create ASSEMBLY MySync 
FROM 'D:\SQLDllTestUsingNew.dll'
WITH PERMISSION_SET = UNSAFE;
复制代码

6、创建一个函数用于调用这个DLL

 

复制代码
CREATE FUNCTION dbo.fun_sync
(  
    @strSql nvarchar(max)
)
RETURNS nvarchar(max)  
AS EXTERNAL NAME [MySync].[SQLDllTestUsingNew.Class1].[GetStr] 
复制代码

7、调用创建的函数。

 select dbo.fun_sync('dsdfg')  

结果: dsdfg水印New

 

 

 

SQL Server 之 存储过程调用C#编写的dll文件

 

新建C#类库,编译。

添加引用

using Microsoft.SqlServer.Server;

方法

[SqlFunction]
public static int GenerateTxt()
{
   ......
}

修改数据库配置

---修改配置
exec sp_configure 'clr enabled', 1;
reconfigure;

根据dll路径注册程序集

--从dll中抽取中间语言(IL)
USE erp303_szzb_szpa
CREATE ASSEMBLY CustomerInfoInterface FROM 'E:\Study\VS2010\PingAnCustomerInfoInterface\PingAnCustomerInfoInterface\bin\Debug\PingAnCustomerInfoInterface.dll'

调用

复制代码
 IF EXISTS ( SELECT  *
            FROM    sysobjects
            WHERE   id = OBJECT_ID('OnTimeWork') ) 
    BEGIN 
        DROP PROCEDURE OnTimeWork
    END 
GO
CREATE PROCEDURE OnTimeWork
AS EXTERNAL NAME 
    [PingAnCustomerInfoInterface].[PingAnCustomerInfoInterface.GetCustomerInfo].[GenerateTxt]
GO

 
复制代码

注意函数调用方法:[AssemblyName].[AssemblyName.ClassName].[FunctionName]

posted on 2025-06-26 23:43  大西瓜3721  阅读(53)  评论(0)    收藏  举报

导航