我使用C#写了一个DLL 供MSSQL2005程序集使用

无语孩童 2010-12-17 01:58:48
我的类库代码:
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SqlServer.Server;
using System.Data.SqlClient;

namespace SQLLib
{
public class SQLLib
{
[SqlFunction(DataAccess = DataAccessKind.None )]
public static int Encode()
{
//SqlConnection conn = new SqlConnection("Data Source=(local);Initial Catalog=salers;User ID=sa;Password=sa");
int i=0;

using (SqlConnection conn = new SqlConnection("Data Source=(local);Initial Catalog=Test;User ID=sa;Password=sa"))
{
SqlCommand cmd = new SqlCommand("select count(*) as c from t_user", conn);
conn.Open();

SqlDataReader dr= cmd.ExecuteReader();
dr.Read();
i = Convert.ToInt32(dr["c"]);

}
return i;
}

[SqlFunction(DataAccess = DataAccessKind.None)]
public static string aa(string str)
{
return str;
}
}
}






我的SQL创建

create assembly [SQLLib]  
FROM 'H:\SQLLib\SQLLib.dll'

CREATE FUNCTION Encode()
RETURNS int
AS
External name [SQLLib].[SQLLib.SQLLib].Encode




当我运行
select   dbo.Encode()  


报出一下错误:
消息 6522,级别 16,状态 2,第 1 行
在执行用户定义例程或聚合 "Encode" 期间出现 .NET Framework 错误:
System.Security.SecurityException: Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
System.Security.SecurityException:
at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
at System.Security.PermissionSet.Demand()
at System.Data.Common.DbConnectionOptions.DemandPermission()
at System.Data.SqlClient.SqlConnection.PermissionDemand()
at System.Data.SqlClient.SqlConnectionFactory.PermissionDemand(DbConnection outerConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
at SQLLib.SQLLib.Encode()

...全文
666 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
无语孩童 2010-12-23
  • 打赏
  • 举报
回复
谁帮帮忙啊
kye_jufei 2010-12-23
  • 打赏
  • 举报
回复
DataAccessKind.Read ...
xxoo2007 2010-12-23
  • 打赏
  • 举报
回复
还有一点
create assembly [SQLLib]
AUTHORIZATION dbo
FROM 'D:\LUKE\CSDN\20101223\SQLLib\SQLLib\bin\Debug\SQLLib.dll'
WITH PERMISSION_SET = UNSAFE
go


"WITH PERMISSION_SET = UNSAFE" 必须的.
xxoo2007 2010-12-23
  • 打赏
  • 举报
回复

[SqlFunction(DataAccess = DataAccessKind.None )]
public static int Encode()
{


改成


[SqlFunction(DataAccess = DataAccessKind.Read )]
public static int Encode()
{

应该就ok啦.
无语孩童 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 dlut_liuq 的回复:]
引用 11 楼 wellnj 的回复:
引用 10 楼 dlut_liuq 的回复:
楼主也可以直接使用vs自带的部署功能,直接发布到数据库,直接调用名称就可以了。



这个以前没有接触过

建立项目的时候会让你选择连接的数据库,写完你自定义完的函数,右键项目 部署
[/Quote]


我依照你的方法 提示部署不成功 但也没有提示错误的信息
无语孩童 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 dlut_liuq 的回复:]
SQL code
EXEC sp_configure 'CLR ENABLE',1
GO
RECONFIGURE
GO
--将UDT导入程序集
CREATE ASSEMBLY ComplexNumbersCS
FROM 'H:\SQLLib\SQLLib.dll'
WITH PERMISSION_SET=SAFE

CREATE FUNCTION Encode()
RET……
[/Quote]



不行 还是报错!!!
无语孩童 2010-12-22
  • 打赏
  • 举报
回复
------ 已启动生成: 项目: SqlServerProject1, 配置: Debug Any CPU ------
SqlServerProject1 -> F:\test\SqlServerProject1\SqlServerProject1\bin\Debug\SqlServerProject1.dll
------ 已启动部署: 项目: SqlServerProject1, 配置: Debug Any CPU ------
生成启动时间为 2010-12-22 15:48:17。
SqlClrDeploy:
开始将程序集 SqlServerProject1.dll 部署到服务器 .: Test
如果部署的 SQL CLR 项目是为与 SQL Server 目标实例不兼容的 .NET Framework 版本生成的,则可能出现以下错误:“部署错误 SQL01268: 针对程序集的 CREATE ASSEMBLY 失败,因为验证程序集失败”。若要解决此问题,请打开项目的属性,然后更改 .NET Framework 版本。
部署脚本已生成到:
F:\test\SqlServerProject1\SqlServerProject1\bin\Debug\SqlServerProject1.sql

正在创建 [SqlServerProject1]...
F:\test\SqlServerProject1\SqlServerProject1\bin\Debug\SqlServerProject1.sql(39-39): Deploy error SQL01268: .Net SqlClient Data Provider: 消息 6218,级别 16,状态 3,行 1 针对程序集 'SqlServerProject1' 的 CREATE ASSEMBLY 失败,原因是程序集 'SqlServerProject1' 未通过身份验证。请检查被引用程序集是否是最新的,而且是可信的(external_access 或 unsafe),能在该数据库中执行。如果有 CLR Verifier 错误消息,将显示在此消息之后
执行批处理时发生错误。

生成失败。

已用时间 00:00:01.82
========== 生成: 成功或最新 1 个,失败 0 个,跳过 0 个 ==========
========== 部署: 成功 0 个,失败 1 个,跳过 0 个 ==========
yy1987316 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 wellnj 的回复:]
引用 12 楼 dlut_liuq 的回复:
引用 11 楼 wellnj 的回复:
引用 10 楼 dlut_liuq 的回复:
楼主也可以直接使用vs自带的部署功能,直接发布到数据库,直接调用名称就可以了。



这个以前没有接触过

建立项目的时候会让你选择连接的数据库,写完你自定义完的函数,右键项目 部署



我依照你的方法 提示部署不成功 但也没有提示错误的信……
[/Quote]

信息在输出里面
飘零一叶 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wellnj 的回复:]
引用 10 楼 dlut_liuq 的回复:
楼主也可以直接使用vs自带的部署功能,直接发布到数据库,直接调用名称就可以了。



这个以前没有接触过
[/Quote]
建立项目的时候会让你选择连接的数据库,写完你自定义完的函数,右键项目 部署
无语孩童 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 dlut_liuq 的回复:]
楼主也可以直接使用vs自带的部署功能,直接发布到数据库,直接调用名称就可以了。
[/Quote]


这个以前没有接触过
飘零一叶 2010-12-21
  • 打赏
  • 举报
回复
楼主也可以直接使用vs自带的部署功能,直接发布到数据库,直接调用名称就可以了。
飘零一叶 2010-12-21
  • 打赏
  • 举报
回复
EXEC sp_configure 'CLR ENABLE',1
GO
RECONFIGURE
GO
--将UDT导入程序集
CREATE ASSEMBLY ComplexNumbersCS
FROM 'H:\SQLLib\SQLLib.dll'
WITH PERMISSION_SET=SAFE

CREATE FUNCTION Encode()
RETURNS int
AS
External name [SQLLib].[SQLLib]
dawugui 2010-12-18
  • 打赏
  • 举报
回复
不懂,帮顶,学习,蹭分.
无语孩童 2010-12-18
  • 打赏
  • 举报
回复
我本想是用C#写类库 可以实现增强SQL函数的功能的!!!
无语孩童 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yy1987316 的回复:]
SQL code
--设置数据库选型TRUSTWORTHY 为on
alter database databasename set trustworthy on
go
--修改程序集为PERMISSION_SET=EXTERNAL_ACCESS
ALTER ASSEMBLY SqlClassLibrary
WITH PERMISSION_SET=EXTERNAL_ACCESS;
GO……
[/Quote]



我执行了下面的代码
alter database test set trustworthy on
go
--修改程序集为PERMISSION_SET=EXTERNAL_ACCESS
ALTER ASSEMBLY [SQLLib]
WITH PERMISSION_SET=EXTERNAL_ACCESS;
GO



在运行
select   dbo.Encode()  



抱一下错误

消息 6522,级别 16,状态 2,第 2 行
在执行用户定义例程或聚合 "Encode" 期间出现 .NET Framework 错误:
System.InvalidOperationException: 在此上下文中不允许访问数据。此上下文可能是不带 DataAccessKind.Read 或 SystemDataAccessKind.Read 标记的函数或方法,也可能是从表值函数的 FillRow 方法为获取数据而进行的回调,还可能是 UDT 验证方法。
System.InvalidOperationException:
at System.Data.SqlServer.Internal.ClrLevelContext.CheckSqlAccessReturnCode(SqlAccessApiReturnCode eRc)
at System.Data.SqlServer.Internal.ClrLevelContext.GetCurrentContext(SmiEventSink sink, Boolean throwIfNotASqlClrThread, Boolean fAllowImpersonation)
at System.Data.SqlServer.Internal.ClrLevelContext.GetCurrentContext(Boolean throwIfNotASqlClrThread, Boolean fAllowImpersonation)
at System.Data.SqlServer.Internal.SqlUtil.GetCurrentTransaction()
at System.Transactions.Transaction.FastGetTransaction(TransactionScope currentScope, ContextData contextData, Transaction& contextTransaction)
at System.Transactions.Transaction.GetCurrentTransactionAndScope(Transaction& current, TransactionScope& currentScope, ContextData& contextData, Transaction& contextTransaction)
at System.Transactions.Transaction.get_Current()
at System.Data.ProviderBase.DbConnectionPool.GetFromTransactedPool(Transaction& transaction)
at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
at SQLLib.SQLLib.Encode()
yy1987316 2010-12-17
  • 打赏
  • 举报
回复
--设置数据库选型TRUSTWORTHY 为on
alter database databasename set trustworthy on
go
--修改程序集为PERMISSION_SET=EXTERNAL_ACCESS
ALTER ASSEMBLY SqlClassLibrary
WITH PERMISSION_SET=EXTERNAL_ACCESS;
GO

试试
jwdream2008 2010-12-17
  • 打赏
  • 举报
回复
你发到.NET版吧!

5,929

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧