C# Can';t将System.IO.Compression添加到SQL Server中的受信任程序集
我试图在NET4.5中创建一个处理ZIP文件的SQLCLR存储过程。显然,C# Can';t将System.IO.Compression添加到SQL Server中的受信任程序集,c#,.net,sql-server,ssms,sqlclr,C#,.net,Sql Server,Ssms,Sqlclr,我试图在NET4.5中创建一个处理ZIP文件的SQLCLR存储过程。显然,System.IO.Compression不在SQL Server的批准列表中,但这是我尝试通过SQL Server Management Studio手动添加它时得到的结果。如果我试图通过查询执行CREATE ASSEMBLY,也会发生同样的情况。有什么想法吗?为什么这是一个否定 我还尝试在SSMS中运行此命令: CREATE ASSEMBLY SystemIOCOMPRESSION FROM 'C:\Program
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
。。。结果与我尝试通过SSMS UI时的结果相同
您试图导入错误的DLL。这是“参考”DLL,而不是实际的“框架”DLL。以下内容将起作用,因为我不仅尝试使用SQL Server 2012,而且还能够导入
System.IO.Compression.FileSystem
并执行System.IO.Compression.ZipFile.CreateFromDirectory()
:
非对称密钥
:
ALTER DATABASE [{dbname}] SET TRUSTWORTHY ON;
CREATE ASSEMBLY [System.IO.Compression]
FROM N'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.IO.Compression.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS;
不安全
):
外部访问权限的权限集
Zip*
类以及System.IO.Compression
和System.IO.Compression.FileSystem
程序集从.Net 4.5开始是新的我知道这是一个老生常谈的问题,但本周早些时候我也在写一个SQLCLR函数,生成报告后ssrs sql代码可以调用该函数,将它们打包成zip文件并通过电子邮件发送给用户 经过一系列的研究和尝试,使用SSRSWeb服务接口是更简单、更合理的方法。您不必触摸数据库设置就可以使用它并执行完全相同的操作 要使用它,您需要向ssrs执行服务添加一个web引用。你可以找到你想要的。一旦配置并添加了web引用,就可以编写C#/VB代码,以选择的格式将所需的任何报告呈现为字节,并保存它们,或者像其他字节流一样使用它们执行所需操作。在我们的例子中,我们编写了一个查询,以获取用户要发送的报告列表,使用api将该用户的所有报告呈现为临时文件,压缩这些临时文件,将其附加到电子邮件,并将电子邮件发送给用户 有一个很好的简单示例,说明了如何使用api呈现报表并将其保存到磁盘。(如果链路失效,代码如下)
一件让我最初感到困惑的事情是,在哪里可以找到上面的各种类型。当您将web引用添加到项目中时,web引用将在以您提供的web引用的名称命名的命名空间中包含所有必需的类型。因此,如果您将web引用命名为
FooService
,则所有报告类型都将位于命名空间FooService
中。因此,您可以在那里找到FooService.ParameterValue
,FooService.ReportExecutionService
,等等。您是否尝试对创建程序集使用外部访问?你能添加产生错误的代码吗?是的,我试过了,但基本上和我在UI上试过的其他东西一样。问题已更新。您可能需要更改数据库dbname SET trustry ON代码>添加程序集之前。我刚刚尝试了这个方法,但是得到了一堆CLR验证程序错误,所以这可能不会让您一直这样做。另外,您试图让SQL Server对这个程序集做什么?如果您试图存储压缩数据,为什么不使用SQL Server本机压缩?trustry ON
已设置,因此不是这样。顺便说一句,我需要做一些压缩工作,不仅仅是用本机压缩存储压缩数据。谢谢!我对此失去了兴趣,但总的来说,它看起来不错。当我再次遇到这个问题时,我一定会尝试一下。
CREATE ASSEMBLY [System.IO.Compression.FileSystem]
FROM N'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.IO.Compression.FileSystem.dll'
WITH PERMISSION_SET = UNSAFE;
string historyID = null;
string deviceInfo = null;
// Can be XML, NULL, CSV, IMAGE, PDF, HTML4.0, HTML3.2,
// MHTML, EXCEL, and HTMLOWC
string format = "Excel";
Byte[] results;
string encoding = String.Empty;
string mimeType = String.Empty;
string extension = String.Empty;
ReportingExec.Warning[] warnings = null;
string[] streamIDs = null;
ReportingExec.ReportExecutionService re = new ReportingExec.ReportExecutionService();
re.Credentials = System.Net.CredentialCache.DefaultCredentials;
ReportingExec.ExecutionInfo ei = re.LoadReport("/directory/ReportName", historyID);
ReportingExec.ParameterValue[] rptParameters = new ReportingExec.ParameterValue[1];
rptParameters[0] = new ReportingExec.ParameterValue();
rptParameters[0].Name = "DateFormatID";
rptParameters[0].Value = "fr-FR";
re.SetExecutionParameters(rptParameters, "en-us");
results = re.Render(
format, deviceInfo, out extension, out encoding,
out mimeType, out warnings, out streamIDs);
FileStream stream = File.Create("C:\\report.xls", results.Length);
stream.Write(results, 0, results.Length);
stream.Close();