如何在 CLR Procedure 中使用 Json Parser?
How to use Json Parser in CLR Procedure?
我疯狂地尝试在我的 Class 库中使用 Json Serializer/Deserializer 并在 SQL 服务器中导入我的程序集。
我正在使用响应 Json 字符串的 WebAPI,我想创建调用 API 的 CLR Sql 过程并使用 api结果。
我尝试了 2 种反序列化 Json 字符串的方法:
1) System.Web.Script.Serialization
2) System.Runtime.Serialization.Json
第一个告诉我这个错误:
Assembly 'system.web.extensions, version=4.0.0.0, culture=neutral,
publickeytoken=31bf3856ad364e35.' was not found in the SQL catalog.
(Microsoft SQL Server, Error: 6503)
第二个:
Assembly 'system.runtime.serialization, version=4.0.0.0,
culture=neutral, publickeytoken=b77a5c561934e089.' was not found in
the SQL catalog. (Microsoft SQL Server, Error: 6503)
有什么方法可以在我的 class 库中解析 json 吗?!
(除了在 class 图书馆为我自己创建一个 Json Serializer/Deserializer !!!)
Visual Studio 2015 社区,Microsoft Sql Server 2016 开发人员
提前致谢。
我自己也遇到过类似的问题,看看 https://github.com/WCOMAB/SqlServerSlackAPI 将 LitJSON 导入其项目的方式。
关键文件:
- https://github.com/WCOMAB/SqlServerSlackAPI/blob/master/src/SqlServerSlackAPI/Include_T4Include.tt
- https://github.com/WCOMAB/SqlServerSlackAPI/blob/master/src/SqlServerSlackAPI/Include_T4Include.cs
您可以采用类似的方法。使用这种方法,我不必将任何其他额外的 CLR 导入到 SQL 服务器实例。
值得一提的是,该程序集必须取消保存。为了部署它,您将有两个选择:
- 将数据库设置为
TRUSTWORTHY
- 设置非对称密钥。这将帮助您:Security risks of setting trustworthy = on in sql server 2012
- 下面 link 有详细的操作说明:http://www.sqlservercentral.com/articles/SQLCLR/138155/
遗憾的是,没有方法既是 .NET Framework 的一部分(即 built-in) 又是 SAFE
。
如果您想要 built-in 方法,那么您 可以 尝试使用 DataContractJsonSerializer class, which is in the System.Runtime.Serialization.Json namespace, which in turn is found in System.Runtime.Serialization.dll. You can find an example of using it here: How to: Serialize and Deserialize JSON Data. HOWEVER, in order to use this inside of SQL Server, you will need to import the System.Runtime.Serialization.dll since it is not one of the Supported .NET Framework Libraries。因为它不受支持,这意味着三件事:
您需要将包含程序集的数据库设置为 TRUSTWORTHY ON
(因为需要 PERMISSION_SET
为 UNSAFE
),通常建议不要这样做因为它存在安全风险。
您无法确定底层代码没有执行可能导致“奇怪”行为的操作,例如在静态 class 变量中缓存值。 SQLCLR 每个 Assembly-owner + 数据库组合使用一个应用程序域。因此 class 将在执行该代码的所有会话之间共享。
您不能保证 System.Runtime.Serialization.dll(或其两个依赖库之一:System.ServiceModel.Internals 和 SMDiagnostics) 不会在未来的 .NET Framework 更新中更改为 mixed-mode DLL。 SQL 服务器中只允许使用纯 MSIL 库,因此如果这 3 个库中的任何一个更改为“混合”,那么您在 SQL 服务器中的代码将开始失败并且无法修复它;你将不得不 re-code 它。这在以前发生过:System.ServiceModel 随着 .NET 4.0 的发布变成了 mixed-mode,因此使用它的代码可以在 SQL Server 2005 中运行, 2008 和 2008 R2(都链接到 CLR v 2.0 和 Framework 版本 2.0 - 3.5),但从 SQL Server 2012 开始不起作用(都链接到 CLR v 4.0 和 Framework 版本 4.0 及更新版本)。
但是,如果您想尝试一下,请执行以下操作(它将 auto-load 2 个依赖的 DLL):
USE [someDB];
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
CREATE ASSEMBLY [System.Runtime.Serialization]
FROM 'C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\System.Runtime.Serialization.dll'
WITH PERMISSION_SET = UNSAFE;
或者, 您可以在项目中包含解析 JSON 的代码。您在这里也有一些选择:
虽然“首选”JSON 解析器是 Json.NET,但我无法将其作为 SAFE
程序集加载。自从我尝试以来已经有几年了,但是它有很多静态 class 变量用于缓存值(有助于提高性能,但不会在共享环境中工作),我似乎记得它依赖于一些不受支持的库(例如 System.Runtime.Serialization)。
我使用 JsonFx 取得了一些成功。该代码还需要一些更新来处理静态 class 变量,但这是可能的。该项目可以处理从 JSON 到一些不同标记的转换。
如@EvaldasBuinauskas 的回答所述,您可以尝试 LitJSON 项目。我没有尝试过这个项目,所以不确定它的效果如何。它似乎比 JsonFX 项目小一点(不支持其他格式),但截至目前它有 25 个未解决的问题,而 JsonFX 只有 16 个。
您可能应该查看这两个项目的“问题”列表,以确保没有报告会导致您出错的内容。
查看此存储库 https://github.com/geral2/SQL-APIConsumer。
第 1 步
CREATE DATABASE TestDB; GO
第 2 步
USE TestDB GO sp_configure 'clr enabled',1 RECONFIGURE GO
第 3 步
ALTER DATABASE TESTDB SET TRUSTWORTHY ON GO
第 4 步
CREATE ASSEMBLY [System.Runtime.Serialization] AUTHORIZATION dbo FROM N'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Runtime.Serialization.dll' WITH PERMISSION_SET = UNSAFE--external_access GO
第 5 步
CREATE ASSEMBLY [Newtonsoft.Json] AUTHORIZATION dbo FROM N'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Newtonsoft.Json.dll' WITH PERMISSION_SET = UNSAFE go
我疯狂地尝试在我的 Class 库中使用 Json Serializer/Deserializer 并在 SQL 服务器中导入我的程序集。
我正在使用响应 Json 字符串的 WebAPI,我想创建调用 API 的 CLR Sql 过程并使用 api结果。
我尝试了 2 种反序列化 Json 字符串的方法:
1) System.Web.Script.Serialization
2) System.Runtime.Serialization.Json
第一个告诉我这个错误:
Assembly 'system.web.extensions, version=4.0.0.0, culture=neutral, publickeytoken=31bf3856ad364e35.' was not found in the SQL catalog. (Microsoft SQL Server, Error: 6503)
第二个:
Assembly 'system.runtime.serialization, version=4.0.0.0, culture=neutral, publickeytoken=b77a5c561934e089.' was not found in the SQL catalog. (Microsoft SQL Server, Error: 6503)
有什么方法可以在我的 class 库中解析 json 吗?! (除了在 class 图书馆为我自己创建一个 Json Serializer/Deserializer !!!)
Visual Studio 2015 社区,Microsoft Sql Server 2016 开发人员
提前致谢。
我自己也遇到过类似的问题,看看 https://github.com/WCOMAB/SqlServerSlackAPI 将 LitJSON 导入其项目的方式。
关键文件:
- https://github.com/WCOMAB/SqlServerSlackAPI/blob/master/src/SqlServerSlackAPI/Include_T4Include.tt
- https://github.com/WCOMAB/SqlServerSlackAPI/blob/master/src/SqlServerSlackAPI/Include_T4Include.cs
您可以采用类似的方法。使用这种方法,我不必将任何其他额外的 CLR 导入到 SQL 服务器实例。
值得一提的是,该程序集必须取消保存。为了部署它,您将有两个选择:
- 将数据库设置为
TRUSTWORTHY
- 设置非对称密钥。这将帮助您:Security risks of setting trustworthy = on in sql server 2012
- 下面 link 有详细的操作说明:http://www.sqlservercentral.com/articles/SQLCLR/138155/
遗憾的是,没有方法既是 .NET Framework 的一部分(即 built-in) 又是 SAFE
。
如果您想要 built-in 方法,那么您 可以 尝试使用 DataContractJsonSerializer class, which is in the System.Runtime.Serialization.Json namespace, which in turn is found in System.Runtime.Serialization.dll. You can find an example of using it here: How to: Serialize and Deserialize JSON Data. HOWEVER, in order to use this inside of SQL Server, you will need to import the System.Runtime.Serialization.dll since it is not one of the Supported .NET Framework Libraries。因为它不受支持,这意味着三件事:
您需要将包含程序集的数据库设置为
TRUSTWORTHY ON
(因为需要PERMISSION_SET
为UNSAFE
),通常建议不要这样做因为它存在安全风险。您无法确定底层代码没有执行可能导致“奇怪”行为的操作,例如在静态 class 变量中缓存值。 SQLCLR 每个 Assembly-owner + 数据库组合使用一个应用程序域。因此 class 将在执行该代码的所有会话之间共享。
您不能保证 System.Runtime.Serialization.dll(或其两个依赖库之一:System.ServiceModel.Internals 和 SMDiagnostics) 不会在未来的 .NET Framework 更新中更改为 mixed-mode DLL。 SQL 服务器中只允许使用纯 MSIL 库,因此如果这 3 个库中的任何一个更改为“混合”,那么您在 SQL 服务器中的代码将开始失败并且无法修复它;你将不得不 re-code 它。这在以前发生过:System.ServiceModel 随着 .NET 4.0 的发布变成了 mixed-mode,因此使用它的代码可以在 SQL Server 2005 中运行, 2008 和 2008 R2(都链接到 CLR v 2.0 和 Framework 版本 2.0 - 3.5),但从 SQL Server 2012 开始不起作用(都链接到 CLR v 4.0 和 Framework 版本 4.0 及更新版本)。
但是,如果您想尝试一下,请执行以下操作(它将 auto-load 2 个依赖的 DLL):
USE [someDB];
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
CREATE ASSEMBLY [System.Runtime.Serialization]
FROM 'C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\System.Runtime.Serialization.dll'
WITH PERMISSION_SET = UNSAFE;
或者, 您可以在项目中包含解析 JSON 的代码。您在这里也有一些选择:
虽然“首选”JSON 解析器是 Json.NET,但我无法将其作为
SAFE
程序集加载。自从我尝试以来已经有几年了,但是它有很多静态 class 变量用于缓存值(有助于提高性能,但不会在共享环境中工作),我似乎记得它依赖于一些不受支持的库(例如 System.Runtime.Serialization)。我使用 JsonFx 取得了一些成功。该代码还需要一些更新来处理静态 class 变量,但这是可能的。该项目可以处理从 JSON 到一些不同标记的转换。
如@EvaldasBuinauskas 的回答所述,您可以尝试 LitJSON 项目。我没有尝试过这个项目,所以不确定它的效果如何。它似乎比 JsonFX 项目小一点(不支持其他格式),但截至目前它有 25 个未解决的问题,而 JsonFX 只有 16 个。
您可能应该查看这两个项目的“问题”列表,以确保没有报告会导致您出错的内容。
查看此存储库 https://github.com/geral2/SQL-APIConsumer。
第 1 步
CREATE DATABASE TestDB; GO
第 2 步
USE TestDB GO sp_configure 'clr enabled',1 RECONFIGURE GO
第 3 步
ALTER DATABASE TESTDB SET TRUSTWORTHY ON GO
第 4 步
CREATE ASSEMBLY [System.Runtime.Serialization] AUTHORIZATION dbo FROM N'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Runtime.Serialization.dll' WITH PERMISSION_SET = UNSAFE--external_access GO
第 5 步
CREATE ASSEMBLY [Newtonsoft.Json] AUTHORIZATION dbo FROM N'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Newtonsoft.Json.dll' WITH PERMISSION_SET = UNSAFE go