我想在 .NET Core 2.0 应用程序和 SQL Server CLR 过程之间共享库。我尝试将共享逻辑放入以下项目类型中:
.NET 标准库
.NET 标准库可以从 .NET Core 项目使用,并且我可以添加来自 SQL Server 项目的引用,但是,不能在 CLR 过程中引用类:

便携式类库
可从 CLR 过程中引用可移植类库。PCL 可以选择以 ASP.NET Core 1.0 为目标,但我无法找到以 .NET Core 2.0 为目标的方法。当我从 .NET Core 2.0 项目引用此库时,出现以下编译错误:
Project PortableLibrary1 is not compatible with netcoreapp2.0 (.NETCoreApp,Version=v2.0). Project PortableLibrary1 supports: dotnet5.0 (.NETPlatform,Version=v5.0)
Run Code Online (Sandbox Code Playgroud)
是否有其他选项可以在 .NET Core 2.0 和 SQL Server CLR 之间共享库?
我编写了一个集成在sql server中的程序集,提供了一些用C#编写的存储过程.该程序集具有一个只读静态变量,用于保存一些配置数据.该数据通过存储过程进行操作,存储过程也由程序集提供.显然我必须同步访问这个静态变量.我试着用
lock(someGuard)
{
// ... access static configuration
}
Run Code Online (Sandbox Code Playgroud)
在我的配置类中.但后来我得到一个HostProtectionException,告诉我,程序集必须以完全信任的方式运行才能做到这一点.有没有更好的方法呢?
我需要使用CLR来创建一个使用.net 3.5中的东西的存储过程.如果我没有把Permission_Set = UnSafe我做不到它会死,然后给我这个错误
部署错误SQL01268:.Net SqlClient数据提供程序:消息6503,级别16,状态12,行1程序集'system.core,版本= 3.5.0.0,culture = neutral,publickeytoken = b77a5c561934e089.' 在SQL目录中找不到.批处理执行时发生错误.
所以我找到了这篇文章
最后一行说明了这一点
"现在DBA肯定不会让我使用它,但构建它很有趣." 我不确定他是否指的是设置为不安全的权限.
如果你这样做,会发生一些巨大的漏洞吗?
我从CLR(.net Assembly)获得了一个sql过程,当执行时返回错误
Msg 6522, Level 16, State 1, Procedure sp_HelloWorld, Line 0
A .NET Framework error occurred during execution of user defined routine or aggregate 'sp_HelloWorld':
System.Security.SecurityException: Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
System.Security.SecurityException:
at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
at System.Security.PermissionSet.Demand()
at System.Data.Common.DbConnectionOptions.DemandPermission()
at System.Data.SqlClient.SqlConnection.PermissionDemand()
at System.Data.SqlClient.SqlConnectionFactory.PermissionDemand(DbConnection outerConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
at HelloWorld.SQLCLR.HelloWorld()
Run Code Online (Sandbox Code Playgroud)
这是我的SQL脚本
go
drop procedure HelloWorld
drop assembly HelloWorld
GO
create assembly HelloWorld from 'F:\HelloWorld.dll'
with …Run Code Online (Sandbox Code Playgroud) 我做了很多工作来开发CLR例程来实现DAL功能,使用VS2010打算将它们移植到SQL2008R2 clr程序集; 单元测试了,一切似乎都没问题.然后是将它们放入SQL CLR程序集的那一天..唉!,SQL2008只支持低于框架3.5的程序集!采用c#4.0功能的日子现在必须被丢弃并滑回c#2.0.花了很多天.
我可以将Framework 4 CLR程序集与SQL2010一起使用吗?
SQL2008R2中是否支持框架4.0支持?如果是的话?
我继承了一个SQL CLR项目,作为我正在为客户工作的代码维护项目的一部分.不可否认,我对SQL CLR很陌生,所以我想弄清楚它是如何工作的.
我注意到数据库连接字符串存储在项目的属性中,所以如果需要,我知道如何更改它.我遇到的一个问题是:是否可以设置多个连接字符串以部署到多个SQL Server实例?在我的例子中,我有一个本地开发机器,一个登台服务器和一个生产服务器(每个服务器上有一个目标数据库的单独副本).我希望能够将SQL CLR程序集部署到所有3,而无需更改连接字符串并为每个连接字符串重新构建.
我想在SQL Server 2012中实现时区转换.但是,TimeZoneInfo标有MayLeakOnAbort属性.当调用我定义的SQL函数(使用TimeZoneInfo)时,这会导致运行时错误.
报告错误如下
System.Security.HostProtectionException:尝试执行CLR主机禁止的操作.
受保护的资源(仅在完全信任的情况下可用)是:全部
需求的资源是:MayLeakOnAbort
文档暗示我可以使用"SafeHandle"来解决这个泄漏问题,但我不知道如何.
那么,如何在SQLCLR上下文中使用类TimeZoneInfo?
跟进:
我在网站上发现了另一个问题,虽然它涉及SQL 2005,但它规定了一个适用于2012的行动.但是,这个解决方案的某些方面并不令人满意.
如何在VS2013数据库项目中禁用生成dll?
我根本不使用SQLCLR.
database sql-server sqlclr visual-studio-2013 sql-server-data-tools
作为我们从Visual Studio 2010升级到2013的努力的一部分,我正在查看需要EXTERNAL访问的几个SQL Server CLR存储过程,并且为此目的将在单独的程序集中隔离.我几乎没有任何东西可以轻松地建造,但这给了我一些麻烦.
由于所讨论的程序集使用新.sqlproj项目类型显然根本不喜欢的Web引用,并且能够继续,我们决定使用VS2010 SP1单独构建该程序集并引用已编译的DLL.组件本身构建得很好,VS2013没有关于引用本身的抱怨.
以下是SQL CLR SP的外观(请不要问我地球上分号最后在那里做了什么):
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.IO;
using System.Text;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static int SQLCLR1(
SqlString in1,
SqlString in2,
SqlString in3,
SqlString in4,
SqlString in5
)
{
// ... code elided ... //
}
};
Run Code Online (Sandbox Code Playgroud)
而SQL方面:
CREATE PROCEDURE [dbo].[SQLCLR1]
@in1 [nvarchar](4000),
@in2 [nvarchar](4000),
@in3 [nvarchar](4000),
@in4 [nvarchar](4000),
@in5 [nvarchar](4000)
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [External].[StoredProcedures].[SQLCLR1] …Run Code Online (Sandbox Code Playgroud) 我试图在NET 4.5中创建一个SQLCLR存储过程,摆弄ZIP文件.显然System.IO.Compression不在SQL Server的批准列表上,但这是我尝试通过SQL Server Management Studio手动添加它时得到的.如果我尝试CREATE ASSEMBLY通过查询执行,也会发生同样的情况.有任何想法吗?为什么这是禁忌?
我也尝试在SSMS中运行此命令:
CREATE ASSEMBLY SystemIOCOMPRESSION
FROM 'C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\System.IO.Compression.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS
Run Code Online (Sandbox Code Playgroud)
...结果与我通过SSMS UI尝试的结果相同.
