2015-02-13 5 views
0

Я хотел обновить значения нескольких столбцов таблицы базы данных, используя запросы или хранимую процедуру, но захотел использовать свою библиотеку C# для изменения значения.Могу ли я использовать хранимую процедуру SQLCLR для обновления столбца таблицы базы данных

Для ех, я хочу столбцы A, B, C таблицы Т должен быть заменен Encrypt(A), Encrypt(B) и Encrypt(C), где Encrypt является частью C# библиотеки.

Я мог бы сделать это в простом консольном приложении, но мне нужно сделать этот процесс для большого количества столбцов в множестве таблиц. Могу ли я использовать хранимую процедуру/запрос SQLCLR для выполнения этого процесса в SQL Server Management Studio?

Будет действительно здорово, если кто-то может помочь в этом.

public class SP 
{ 
    [Microsoft.SqlServer.Server.SqlFunction()] 
    public static void Enc() 
    { 
     using (SqlConnection connection = new SqlConnection("context connection=true")) 
     {    
      connection.Open(); 
      SqlCommand command; 
      SqlCommand command1; 

      for (int i = 0; i < 1; i++) 
      {     
       command = new SqlCommand("SELECT " + tableFieldArray[i, 1].ToString() + " FROM " + tableFieldArray[i, 0].ToString(), connection); 

       SqlDataReader reader = command.ExecuteReader();     

       using (reader) 
       { 
        while (reader.Read()) 
        { 
         if (!reader.IsDBNull(0) && !String.IsNullOrEmpty(reader.GetString(0))) 
         {        
          //SqlContext.Pipe.Send("Data = " + reader.GetString(0) + "; Encrypted = " + Encrypt(reader.GetString(0))); 
          SqlContext.Pipe.Send("UPDATE " + tableFieldArray[i, 0].ToString() + " SET " 
                   + tableFieldArray[i, 1].ToString() + " = '" + Encrypt(reader.GetString(0)) + "' " 
                   + "WHERE " + tableFieldArray[i, 1].ToString() + " = '" + reader.GetString(0) + "'");        
          //query = "UPDATE " + tableFieldArray[i, 0].ToString() + " SET " 
          //          + tableFieldArray[i, 1].ToString() + " = '" + Encrypt(reader.GetString(0)) + "' " 
          //          + "WHERE " + tableFieldArray[i, 1].ToString() + " = '" + reader.GetString(0) + "'";                       
          command1 = new SqlCommand("UPDATE " + tableFieldArray[i, 0].ToString() + " SET " 
                   + tableFieldArray[i, 1].ToString() + " = '" + Encrypt(reader.GetString(0)) + "' " 
                   + "WHERE " + tableFieldArray[i, 1].ToString() + " = '" + reader.GetString(0) + "'",connection); 
         }      
        } 
       } 

       SqlCommand command1 = new SqlCommand(query , connection); 
       command1.ExecuteNonQuery(); 
      } 

      connection.Close(); 
      } 
     } 

     public static string Encrypt(string TextFromForm) 
     { 
      //implementation 
     } 
    } 
} 
+0

** Точный дубликат ** из [Могу ли я использовать SQLCLR хранимую процедуру для обновления столбец таблица базы данных (с использованием некоторой скомпилированной dll)] (http://stackoverflow.com/questions/28502697/can-i-use-sqlclr-stored-procedure-to-update-a-column-of- a-database-table-using) - пожалуйста ** не ** продолжайте задавать один и тот же вопрос снова и снова! (другой был всего 40 минут назад ......) –

+0

@marc_s, я новичок в стеке, не знаю, где закрыть предыдущий, мой предыдущий вопрос получил downvoted (без каких-либо объяснений) даже до того, как я смог собирать код и редактировать его. поэтому я разместил новое, думая, что предыдущий не будет рассмотрен. это было совершенно непреднамеренно. Требуется время для составления четкого вопроса: –

+0

Shweta, это можно закрыть. Я уже отвечаю на другой, поэтому вам не нужно беспокоиться об этом. Я скопирую ответы на мои ответы на другой вопрос. –

ответ

1

По какой-то причине этот вопрос является полным дубликатом (Can I use SQLCLR stored procedure to update a column of a database table (using some compiled dll)), но при условии, что другой будет закрыт (это должно быть), то мой ответ тот же:


Вы может использовать SQLCLR для вызова шифрования с C#, хотя это неправильный подход. Если вам нужно выполнить собственный алгоритм, вы должны инкапсулировать его в функцию SQLCLR, чтобы его можно было использовать в инструкции UPDATE или даже в INSERT или SELECT или в любом месте. Что-то вроде:

public class SP 
{ 
    [Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true)] 
    public static SqlString EncryptByAES(SqlString TextToEncrypt) 
    { 
    return DoSomething(TextToEncrypt.Value); 
    } 
} 

Затем вы можете использовать эту функцию следующим образом:

UPDATE tb 
SET tb.FieldA = EncryptByAES(tb.FieldA) 
FROM dbo.TableName tb 
WHERE tb.FieldA some_test_to_determine_that_FieldA_is_not_alreay_encrypted; 

НО, прежде чем написать собственный алгоритм шифрования, вы можете проверить несколько встроенных в паре ENCRYPTBY/DECRYPTBY функции, которые могли бы сделать именно то, что вам нужно:

+0

да, я новичок в stackoverflow и думал, что мой вопрос не будет рассмотрен, потому что он был опущен без каких-либо объяснений даже до того, как я смог собрать код, который будет добавлен к нему. Спасибо тонну за ответ. –

+0

Как использовать эти встроенные методы шифрования/дешифрования? Я использую класс, управляемый AES, который будет доступен в нем? –

+0

@ShwetaSaxena Я обновил ссылки на встроенные функции. Если ни одна из них не будет работать на вас, структура, которую я опубликовал для базовой функции, будет способом. –

Смежные вопросы