龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C#开发 >

CLR函数压缩NTEXT类型字段实例讲解

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
Microsoft开发的CLR被我们所熟悉,怎样能跟好更快的利用clr函数压缩ntext的问题,大家来看看这篇文章吧,相信一定会给你很大的收获。 CLR(公共语言运行库)和Java虚拟机一样也是一个运行

Microsoft开发的CLR被我们所熟悉,怎样能跟好更快的利用clr函数压缩ntext的问题,大家来看看这篇文章吧,相信一定会给你很大的收获。

CLR(公共语言运行库)和Java虚拟机一样也是一个运行时环境,它负责资源管理(内存分配和垃圾收集),并保证应用和底层操作系统之间必要的分离。为了提高平台的可靠性,以及为了达到面向事务的电子商务应用所要求的稳定性级别,CLR还要负责其他一些任务,比如监视程序的运行。按照.NET的说法,在CLR监视之下运行的程序属于"受管理的"(managed)代码,而不在CLR之下、直接在裸机上运行的应用或者组件属于"非受管理的"(unmanaged)的代码 。可以在 SQL Server 实例中创建可在 Microsoft .NET Framework 公共语言运行时 (CLR) 中创建的程序集中进行编程的数据库对象。可以充分利用公共语言运行时所提供的丰富的编程模式的数据库对象包括聚合函数、函数、存储过程、触发器以及类型。下面给大家举个sql server 2005 使用clr函数压缩ntext类型字段例子:

vs2005为数据新建一个数据库工程。

  1. using System;  
  2. using System.Data;  
  3. using System.Data.SqlClient;  
  4. using System.Data.SqlTypes;  
  5. using Microsoft.SqlServer.Server;  
  6. using System.IO;  
  7. using System.IO.Compression;  
  8. using System.Text;  
  9. public partial class Gzip  
  10. {  
  11. [Microsoft.SqlServer.Server.SqlFunction]  
  12. public static SqlChars GzipToString(SqlBytes gBytes)  
  13. {  
  14. byte[] bytes = gBytes.Value;  
  15. bytes = Decompress(bytes);  
  16. string str = Encoding.GetEncoding(936).GetString(bytes);  
  17. SqlChars sqlchars = new SqlChars(str);  
  18. return (sqlchars);  
  19. }  
  20. [Microsoft.SqlServer.Server.SqlFunction]  
  21. public static SqlBytes StringToGzip(SqlChars chars)  
  22. {  
  23. byte[] bytes = Encoding.GetEncoding(936).GetBytes(chars.Buffer);  
  24. bytes = Compress(bytes);  
  25. SqlBytes gBytes = new SqlBytes(bytes);  
  26. return (gBytes);  
  27. }  
  28. #region 采用.net系统自带Gzip压缩类进行流压缩  
  29. /// <summary> 
  30. /// 压缩数据  
  31. /// summary> 
  32. /// <param name="data">param> 
  33. /// <returns>returns> 
  34. public static byte[] Compress(byte[] data)  
  35. {  
  36. byte[] bData;  
  37. MemoryStream ms = new MemoryStream();  
  38. GZipStream stream = new GZipStream(ms, CompressionMode.Compress, true);  
  39. stream.Write(data, 0, data.Length);  
  40. stream.Close();  
  41. stream.Dispose();  
  42. //必须把stream流关闭才能返回ms流数据,不然数据会不完整  
  43. //并且解压缩方法stream.Read(buffer, 0, buffer.Length)时会返回0  
  44. bData = ms.ToArray();  
  45. ms.Close();  
  46. ms.Dispose();  
  47. return bData;  
  48. }  
  49. /// <summary> 
  50. /// 解压数据  
  51. /// summary> 
  52. /// <param name="data">param> 
  53. /// <returns>returns> 
  54. public static byte[] Decompress(byte[] data)  
  55. {  
  56. byte[] bData;  
  57. MemoryStream ms = new MemoryStream();  
  58. ms.Write(data, 0, data.Length);  
  59. ms.Position = 0;  
  60. GZipStream stream = new GZipStream(ms, CompressionMode.Decompress, true);  
  61. byte[] buffer = new byte[1024];  
  62. MemoryStream temp = new MemoryStream();  
  63. int read = stream.Read(buffer, 0, buffer.Length);  
  64. while (read > 0)  
  65. {  
  66. temp.Write(buffer, 0, read);  
  67. read = stream.Read(buffer, 0, buffer.Length);  
  68. }  
  69. //必须把stream流关闭才能返回ms流数据,不然数据会不完整  
  70. stream.Close();  
  71. stream.Dispose();  
  72. ms.Close();  
  73. ms.Dispose();  
  74. bData = temp.ToArray();  
  75. temp.Close();  
  76. temp.Dispose();  
  77. return bData;  
  78. }  
  79. #endregion  

给数据库增加一个varbinary(MAX) 字段,把压缩以后的转移过来以后删除原来的字段。

然后使用clr函数的这两个如下

  1. select:  
  2. SELECT top 10 dbo.GzipToString([content1]) FROM [content_02]  
  3. insert: insert into   [content_02] ([content1]) values(dbo.StringToGzip('123abc'))  

以上是clr函数压缩问题的小例子,快试试吧。


精彩图集

赞助商链接