2011-08-09 65 views
0

我正在運行正在調試過程中的MS SQL Server 2008 R2安裝。SQL CLR - 安全/不安全內存使用問題

我已經寫了一個應用程序,它可以在需要的表格上按需要進行加密和解密。此應用程序使用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清理?當我運行它時,內存消耗會增加,但內存永遠不會被釋放;我真的不想等到應用程序域卸載後才能釋放內存!你們

謝謝..

回答

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不安全,則建議用而不是來繞過建議,除非您確切知道自己在做什麼。我會建議先看看支持的方式。