我的类库代码:
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()

解决方案 »

  1.   

    --设置数据库选型TRUSTWORTHY 为on
    alter database databasename set trustworthy on
    go
    --修改程序集为PERMISSION_SET=EXTERNAL_ACCESS
    ALTER ASSEMBLY SqlClassLibrary
    WITH PERMISSION_SET=EXTERNAL_ACCESS;
    GO
    试试
      

  2.   


    我执行了下面的代码
    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()
      

  3.   

    我本想是用C#写类库 可以实现增强SQL函数的功能的!!!
      

  4.   

    EXEC sp_configure 'CLR ENABLE',1
    GO
    RECONFIGURE
    GO
    --将UDT导入程序集
    CREATE ASSEMBLY ComplexNumbersCS
    FROM 'H:\SQLLib\SQLLib.dll' 
    WITH PERMISSION_SET=SAFECREATE FUNCTION Encode() 
    RETURNS int
    AS 
    External name [SQLLib].[SQLLib]
      

  5.   

    ------ 已启动生成: 项目: 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 个 ==========
      

  6.   


     [SqlFunction(DataAccess = DataAccessKind.None )]
            public static int   Encode()
            {
    改成
     [SqlFunction(DataAccess = DataAccessKind.Read )]
            public static int   Encode()
            {应该就ok啦.
      

  7.   

    还有一点 
    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" 必须的.