SQL CLR - 安全/不安全和内存使用问题

时间:2011-08-09 17:20:00

标签: c# sql clr

我正在运行正在进行调试的MS SQL Server 2008 R2安装。

我编写了一个应用程序,可以根据需要对表中的列进行加密和解密,效果很好。此应用程序使用DataTable对象来处理任何给定表中的行。

为了将它集成到SQL中,我不得不首先创建以下程序集以满足DataTable对象的用法:

create assembly [system.data.datasetextensions]
from 'C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.DataSetExtensions.dll'
with permission_set = unsafe

没问题;当然,我必须声明这是不安全的,因为它包含一个未标记为只读的静态字段,因此不是线程安全的,因此从执行到执行是不可预测的。

但是,我想声明我的主要CLR DLL是安全的(显然通过签名,放入GAC等)并且可以做到这一点没有probs。但是,当我运行代码时,我得到一个讨厌的'索引超出范围'错误,如果我声明我的主要CLR DLL也不安全,它不会引起它的丑陋头。我认为这是因为我试图访问一个不安全的程序集,这对于安全程序集来说是不行的???

第二件事是如果这个主要的CLR DLL运行不安全,那么“过期”的CLR调用没有被SQL Server / .Net清理掉吗?我运行它时内存消耗增加,但内存似乎永远不会被释放;我真的不想等到App Domain被卸载才能释放内存!!

谢谢你们..

1 个答案:

答案 0 :(得分:0)

您确定没有其他方法可以使用DataTable吗?

1)你可以使用SqlCommand,就像这个例子一样吗? http://msdn.microsoft.com/en-us/library/ms131094.aspx

using System;
using System.Data.SqlTypes;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server; 

public class StoredProcedures 
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void PriceSum(out SqlInt32 value)
    {
        using(SqlConnection connection = new SqlConnection("context connection=true")) 
        {
           value = 0;
           connection.Open();
           SqlCommand command = new SqlCommand("SELECT Price FROM Products", connection);
           SqlDataReader reader = command.ExecuteReader();

           using (reader)
           {
              while( reader.Read() )
              {
                  value += reader.GetSqlInt32(0);
              }
           }         
        }
    }
}

2)您的加密和解密函数是否可写为CLR函数?为什么需要查看表函数的值?你能从常规UPDATE语句读取值并将它们传递给那些函数吗?

如果程序集对SQL不安全,建议绕过建议,除非您确切知道自己在做什么。我建议先看看支持的方法。