2016-04-17 16 views
0

我使用SqlBulkCopySystem.Data.Datatable將數據插入到我的數據庫中。我在做這樣的事情:如何使用SqlBulkCopy填充數據庫中的加密列?

var table = new DataTable(); 

// Creating table schema 
var newRow = table.NewRow(); 
newRow["FirstName"] = Parser.Parse(values[0]) 
newRow["LastName"] = Parser.Parse(values[1]) 
... 
newRos["SSN"] = //here I need to encrypt by db certificate value[5] before set it to this row value 

而簡單的複製到DB代碼:

using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction)) 
{ 
    bulkCopy.BatchSize = 100; 
    bulkCopy.DestinationTableName = "dbo.Member"; 
    try 
    {  
     bulkCopy.WriteToServer(table); 
    } 
    catch (Exception) 
    { 
     transaction.Rollback(); 
     connection.Close(); 
     throw; 
    } 
} 

我當然可以設置加密列使用後與數據庫中的存儲過程,但我想要做的這在一次交易中。是否可以使用代碼中的數據庫中的證書加密string值?

在此先感謝!

+0

爲什麼不能使用該值在C#代碼中對其進行加密?爲什麼在加密後無法向DataTable添加值? –

+0

@Shahar我有一個主密鑰,在數據庫中有一些算法的證書。你確定從代碼加密的數據將與使用db過程解密後的數據兼容嗎? – user3818229

回答

1

當我看到這一點,你可以選擇下列選項之一(這應該是既容易實現):

執行加密在C#代碼

既然你把所有的數據在那裏,您可以使用.NET Framework相關類進行加密。你可以測試它,並確保你得到相同的結果。

使用後INSERT觸發器

添加值後,您會修改和添加加密的數據。觸發器將成爲同一交易的一部分。只需使用CREATE TRIGGER語句創建一個新的觸發器,檢查值是否爲NULL,然後使用SQL語句放置加密值。

例如:

CREATE TRIGGER [dbo].[myTrigger] 
    ON [dbo].[Members] 
    AFTER INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 
    UPDATE Members 
    SET [EncryptedSSN] = EncryptByKey(Key_GUID('SSN_Key'), inserted.SSN) 
    FROM inserted 
    INNER JOIN dbo.Members On inserted.id = Members.id 
END 

希望這有助於。

+0

如果我第二路走,你的意思是這樣的?: 'CREATE TRIGGER trigAddMember ON dbo.Member 對於插入 AS BEGIN SET NOCOUNT ON; UPDATE [DBO]。[會員] DECLARE @NewSSN VARCHAR(100) SELECT @NewSSN =(SELECT SSN FROM INSERTED) SET [EncryptedSSN] = EncryptByKey的(Key_GUID( 'SSN_Key'),i.SSN) UPDATE [ dbo.Member] SET i.SSN = NULL END'? – user3818229

+0

@ user3818229我想你最後忘了UPDATE語句。你還應該添加像UPDATE dbo.Member SET EncryptedSSN = @ NewSSN FROM插入內部連接dbo.Members ON inserted.ID = members.ID –

+0

哦對不起,一開始沒有看到它。是的,但是你應該在WHERE子句中使用UPDATE子句。 –

相關問題