我可以使用 SQLCLR 存储过程来更新数据库的列 table (使用一些已编译的 dll)
Can I use SQLCLR stored procedure to update a column of a database table ( using some compiled dll)
我想使用查询或存储过程更新数据库 table 中几个列的值,但想使用我的 C# 库来更改值。
例如,我希望将 table T 的列 A、B、C 替换为 Encrypt(A)、Encrypt(B) 和 Encrypt(C),其中 Encrypt 是 C# 的一部分图书馆。我本可以在一个简单的控制台应用程序中完成它,但我必须对很多 table 中的很多列执行此过程。
我可以使用 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
}
}
}
您可以使用 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 函数,它们可能完全满足您的需要:
我想使用查询或存储过程更新数据库 table 中几个列的值,但想使用我的 C# 库来更改值。
例如,我希望将 table T 的列 A、B、C 替换为 Encrypt(A)、Encrypt(B) 和 Encrypt(C),其中 Encrypt 是 C# 的一部分图书馆。我本可以在一个简单的控制台应用程序中完成它,但我必须对很多 table 中的很多列执行此过程。
我可以使用 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
}
}
}
您可以使用 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 函数,它们可能完全满足您的需要: