原文 SQL中采用Newtonsoft.Json处理json字符串

使用环境:

SQL Server2005;

VS2010;

关于SQL中部署CLR程序集的方法,网上一搜一大把,需要了解的自行查阅,呵呵。

SQL中处理字符串实在是太弱了,连数组都不能处理,就更别说json字符串了,好吧,它不能处理,我就给它加个处理程序集(还好2005已经加入了这个功能)。

首先对于CLR我也不太懂,而且到现在我也没搞懂怎么把一个dll注册到SQL,俺是直接用VS2010新建一个sql sever的数据库项目,然后部署到SQL,能省多少操作就省多少操作。

这里说一下CLR 数据库项目,第一次开发实在没搞懂引用竟然不能选择本地的Newtonsoft.Json.dll文件,而且好多c#类库也没有,这让我怎么使用Newtonsoft.Json啊?

好吧,我做了最笨的办法,直接将Newtonsoft.Json的源码复制进我的项目里面,错误是一大堆一大堆,首先是.net版本 检测错误,后面直接使用.net3.5的方法(2005不支持4.0或以上的.net版本),把多余的全删了,后面发现竟然在这个项目中没有System.Runtime.Serialization中的全部类,比如EnumMemberAttribute就木有,好吧,我再把这个类的代码复制过来,ok,一一复制结束,编译,哈哈,没错了!开始部署吧。

等待半天提示错误:在SQL目录中找不到程序集:system.core, version=3.5.0.0 这里我又晕了半天,如何把这个东东搞进SQL的目录呢?终于有位仁兄说:

SQL SERVER并不支持System.Core.dll程序集,应先加载:

  1. EXEC dbo.sp_changedbowner @loginame = N'sa', @map = true
  2. GO
  3. sp_configure 'clr enabled', 1
  4. GO
  5. RECONFIGURE
  6. GO
  7. ALTER DATABASE [stzpbbs] SET TRUSTWORTHY ON
  8. GO
  9. CREATE ASSEMBLY [System.Core]
  10. AUTHORIZATION [dbo]
  11. FROM
  12. 'C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll'
  13. WITH PERMISSION_SET = UNSAFE
  14. GO

改成自己的数据库名称,执行,成功,点开数据库的程序集目录,果然有了,那就再部署、、、、、又提示在SQL目录中找不到程序集:System.Xml.Linq,那意思刚才的system.core已经引入正确了,到这里,我没有再继续下去了,既然system.core可以直接引入数据库,Newtonsoft.Json行不行呢?顺这个思路,总共需要引入的库有:

System.Core.dll

System.Xml.Linq.dll

SMdiagnostics.dll

System.Runtime.Serialization.dll

Newtonsoft.Json.dll

注意,PERMISSION_SET = UNSAFE  ,全部设置为unsafe。

Newtonsoft.Json.dll添加成功后,再打开vs2010新建数据库项目,添加引用,在列表就能看到Newtonsoft.Json这个库 了,哈哈,点击引用,新建用户自定义函数,现在可以直接使用Newtonsoft.Json的方法反序列化json字符串了,内容如下:

  1. using System;
  2. using System.Data;
  3. using System.Data.SqlClient;
  4. using System.Data.SqlTypes;
  5. using Microsoft.SqlServer.Server;
  6. using Newtonsoft.Json;
  7. using Newtonsoft.Json.Linq;
  8. public partial class UserDefinedFunctions
  9. {
  10. [Microsoft.SqlServer.Server.SqlFunction]
  11. public static SqlString Json(string json,string key)
  12. {
  13. // 在此处放置代码
  14. JObject ja = (JObject)JsonConvert.DeserializeObject(json);
  15. string re = ja[key].ToString();
  16. return new SqlString(re);
  17. }
  18. [Microsoft.SqlServer.Server.SqlFunction]
  19. public static SqlString JsonArray(string json,int s, string key)
  20. {
  21. // 在此处放置代码
  22. JArray ja = (JArray)JsonConvert.DeserializeObject(json);
  23. string re = ja[s][key].ToString();
  24. return new SqlString(re);
  25. }
  26. };

最后部署,数据库中调用方法:

  1. print dbo.Json('{key:"001",value:"你好"}','value')
  2. print dbo.JsonArray('[{key:"001",value:"你好"},{key:"002",value:"不好"}]',1,'value')
  1. 你好
  2. 不好
作者:kunoy

申明:作者写博是为了总结经验,和交流学习之用。
如需转载,请尽量保留此申明,并在文章页面明显位置给出原文连接。谢谢!

最新文章

  1. idea怎么设置自己的名字和时间
  2. iOS Unicode和汉字互转
  3. Odoo 中group domain的优化应用
  4. svn插件subclipse使用http代理同步svn时出现异常(解决)
  5. CruiseControl.Net学习记录
  6. DrawerLayout带有侧滑功能的布局类(2)
  7. MongoDB (二) MongoDB 优点
  8. php ticks 调试应用
  9. nginx 根据IP 进行灰度发布
  10. java类到底是如何加载并初始化的?
  11. Codeforces 777B Game of Credit Cards
  12. 4.Git基础-查看提交历史
  13. Linux交换分区使用过多的处理办法
  14. CF D.Mister B and Astronomers
  15. AWS专线服务总结和疑问
  16. June 7. 2018 Week 23rd Thursday
  17. [c/c++] programming之路(15)、多维数组和二分查找法,小外挂
  18. Android手机上Audio DSP频率低 memory小的应对措施
  19. eclipse卸载自带maven
  20. LinkedList剖析

热门文章

  1. 用ssh建立机器之间的信任机制
  2. C#按钮客户端验证
  3. Android自定义View和控件之一-定制属于自己的UI
  4. FlashFXP使用教程
  5. Java学习之String对象为什么是不可变的
  6. codeforces 540D 概率dp
  7. 原理图产生网络表后导进PADS之后,网络乱了的问题
  8. 基于MDK的ARM-GCC开发环境建立及新唐M0的HID类设备的C++开发
  9. CCNP路由实验(1) -- EIGRP
  10. [LeetCode] Best Time to Buy and Sell Stock Solution