MSSQL 调用C#程序集 实现C#字符串到字符的转化
10多年前用过MSSQL 调用C#程序集来实现数据的加密和解密,也搞过通过字符偏移实现简单的加密和解密。这次就总结一下吧:
C#如下:
public class CLRFunctions { /// <summary> /// 数据加密 /// </summary> /// <param name="target"></param> /// <returns></returns> public static String DataEncrypt(string target, int keyLen) { if (string.IsNullOrEmpty(target)) return string.Empty; string str = string.Empty; char[] arr = target.ToCharArray(); for (int i = 0; i < arr.Length; i++) { char c = arr[i]; str = str + ((char)(c + keyLen)); } return str; } /// <summary> /// 数据解密 /// </summary> /// <param name="target"></param> /// <returns></returns> public static String DataDecrypt(string target, int keyLen) { if (string.IsNullOrEmpty(target)) return string.Empty; string str = string.Empty; char[] arr = target.ToCharArray(); for (int i = 0; i < arr.Length; i++) { char c = arr[i]; str = str + ((char)(c - keyLen)); } return str; } }
SQL如下,这里需要启用程序集功能,然后在创建程序集:
exec sp_configure 'show advanced options', '1'; go reconfigure; go exec sp_configure 'clr enabled', '1' go reconfigure; exec sp_configure 'show advanced options', '1'; go if exists (select * from sys.assemblies where name='CLRFunctions') drop assembly CLRFunctions; go CREATE ASSEMBLY CLRFunctions FROM 'd:\sql\xxx.dll' ; Go if exists(select 0 from sysobjects where name='dbo.DataEncrypt' and xtype='FN') begin drop function dbo.DataEncrypt end go CREATE FUNCTION dbo.DataEncrypt ( @target as nvarchar (200), @keyLen as int ) RETURNS nvarchar (200) AS EXTERNAL NAME CLRFunctions.CLRFunctions.DataEncrypt go if exists(select 0 from sysobjects where name='dbo.DataDecrypt' and xtype='FN') begin drop function dbo.DataDecrypt end go CREATE FUNCTION dbo.DataDecrypt ( @target as nvarchar (200), @keyLen as int ) RETURNS nvarchar (200) AS EXTERNAL NAME CLRFunctions.CLRFunctions.DataDecrypt
后来尝试用SQL实现C#的ToCharArray方法,在实现字符偏移,SQL如下:
if exists(select 0 from sysobjects where name='DataEncrypt' and xtype='FN') begin drop function dbo.DataEncrypt end go CREATE FUNCTION dbo.DataEncrypt(@target nvarchar (200),@keyLen int) RETURNS nvarchar (200) AS BEGIN DECLARE @position int,@ret nvarchar(200); SET @position = 1; set @ret='' WHILE @position <= len(@target) BEGIN set @ret=@ret+ nchar(unicode(SUBSTRING(@target, @position, 1))+@keylen) SET @position = @position + 1 END; RETURN @ret END go if exists(select 0 from sysobjects where name='DataDecrypt' and xtype='FN') begin drop function dbo.DataDecrypt end go CREATE FUNCTION dbo.DataDecrypt(@target nvarchar (200),@keyLen int) RETURNS nvarchar (200) AS BEGIN DECLARE @position int,@ret nvarchar(200); SET @position = 1; set @ret='' WHILE @position <= len(@target) BEGIN set @ret=@ret+ nchar(unicode(SUBSTRING(@target, @position, 1))-@keylen) SET @position = @position + 1 END; RETURN @ret END
windows技术爱好者
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2013-05-19 如何将sql 执行的错误消息 记录到本地文件中