我正在运行正在进行调试的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被卸载才能释放内存!!
谢谢你们..
答案 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不安全,建议不绕过建议,除非您确切知道自己在做什么。我建议先看看支持的方法。