实现受管理代码功能的步骤
1.创建一个c#项目(类库),创建一个类,声明一个静态的方法
并实现一个功能,如:对文件进行写入的功能
2.编译该项目,生成.dll文件(其它的项目生成的是.exe文件)
3.在数据库查询编辑窗口编写如下代码:
a. 创建数据库程序集对象
create assembly assembly_name from 程序集文件的全路径
with permission_set=safe|external_access|unsafe
b.创建存储过程
create procedure proc_name as external name
assembly_name.[类所在的程序集名称.类名].方法名
c.执存储过程
exec proc_name出现的问题:
1.针对程序集 'library1' 的 CREATE ASSEMBLY 失败,因为程序集 'library1' 未获授权(PERMISSION_SET = EXTERNAL_ACCESS)。
当符合以下两个条件之一时,将对程序集授权: 数据库所有者(DBO)具有 EXTERNAL ACCESS ASSEMBLY 权限,而且数据库的 TRUSTWORTHY 属性处于打开状态;或者,程序集签名时所使用的证书或非对称密钥所对应的登录名具有
EXTERNAL ACCESS ASSEMBLY 权限。
原因:
a. 登录用户不具备EXTERNAL ACCESS ASSEMBLY权限
b. 数据库的信任模式没有打开
c. 程序集文件可能有多个版本(本机上装了两个vs)
解决方法:
a.修改登录用户的权限,使该用户具有EXTERNAL ACCESS ASSEMBLY
b.打开数据库的信任模式
ALTER DATABASE DATABASENAME SET TRUSTWORTHY ON
c.打开控制面板->添加或删除组件->卸载vs其中的一个版本(如果只有一个vs版本就不用考虑)
2.禁止在 .NET Framework 中执行用户代码。启用 "clr enabled" 配置选项。
原因:
数据库未启动对.NET Framework的CLR的支持
解决方法:启用数据库CLR支持
exec sp_configure clr_enabled,1;
go
reconfigure;
go案例:
1.数据库部分:
ALTER DATABASE testdb SET TRUSTWORTHY on create assembly ConvertFileWriteAssembly From
'E:\library1\library1\bin\Debug\library1.dll'
with permission_set = external_access create procedure clrproc as external name
ConvertFileWriteAssembly.[library1.Class1].WriteMsg exec sp_configure clr_enabled,0;
go
reconfigure;
go exec clrproc2.c#代码部分:
namespace library1
{
public class Class1
{
public static void WriteMsg()
{
FileStream f = new FileStream(@"e:\a.txt", FileMode.OpenOrCreate);
StreamWriter write = new StreamWriter(f);
write.WriteLine("Hello world!");
write.Close();
f.Close();
}
}
}
1.创建一个c#项目(类库),创建一个类,声明一个静态的方法
并实现一个功能,如:对文件进行写入的功能
2.编译该项目,生成.dll文件(其它的项目生成的是.exe文件)
3.在数据库查询编辑窗口编写如下代码:
a. 创建数据库程序集对象
create assembly assembly_name from 程序集文件的全路径
with permission_set=safe|external_access|unsafe
b.创建存储过程
create procedure proc_name as external name
assembly_name.[类所在的程序集名称.类名].方法名
c.执存储过程
exec proc_name出现的问题:
1.针对程序集 'library1' 的 CREATE ASSEMBLY 失败,因为程序集 'library1' 未获授权(PERMISSION_SET = EXTERNAL_ACCESS)。
当符合以下两个条件之一时,将对程序集授权: 数据库所有者(DBO)具有 EXTERNAL ACCESS ASSEMBLY 权限,而且数据库的 TRUSTWORTHY 属性处于打开状态;或者,程序集签名时所使用的证书或非对称密钥所对应的登录名具有
EXTERNAL ACCESS ASSEMBLY 权限。
原因:
a. 登录用户不具备EXTERNAL ACCESS ASSEMBLY权限
b. 数据库的信任模式没有打开
c. 程序集文件可能有多个版本(本机上装了两个vs)
解决方法:
a.修改登录用户的权限,使该用户具有EXTERNAL ACCESS ASSEMBLY
b.打开数据库的信任模式
ALTER DATABASE DATABASENAME SET TRUSTWORTHY ON
c.打开控制面板->添加或删除组件->卸载vs其中的一个版本(如果只有一个vs版本就不用考虑)
2.禁止在 .NET Framework 中执行用户代码。启用 "clr enabled" 配置选项。
原因:
数据库未启动对.NET Framework的CLR的支持
解决方法:启用数据库CLR支持
exec sp_configure clr_enabled,1;
go
reconfigure;
go案例:
1.数据库部分:
ALTER DATABASE testdb SET TRUSTWORTHY on create assembly ConvertFileWriteAssembly From
'E:\library1\library1\bin\Debug\library1.dll'
with permission_set = external_access create procedure clrproc as external name
ConvertFileWriteAssembly.[library1.Class1].WriteMsg exec sp_configure clr_enabled,0;
go
reconfigure;
go exec clrproc2.c#代码部分:
namespace library1
{
public class Class1
{
public static void WriteMsg()
{
FileStream f = new FileStream(@"e:\a.txt", FileMode.OpenOrCreate);
StreamWriter write = new StreamWriter(f);
write.WriteLine("Hello world!");
write.Close();
f.Close();
}
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货