Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';t将System.IO.Compression添加到SQL Server中的受信任程序集_C#_.net_Sql Server_Ssms_Sqlclr - Fatal编程技术网

C# Can';t将System.IO.Compression添加到SQL Server中的受信任程序集

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

我试图在NET4.5中创建一个处理ZIP文件的SQLCLR存储过程。显然,
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()

  • 这是必需的,因为您无法从.Net Framework DLL创建
    非对称密钥

    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开始是新的
  • 您只能在SQL Server 2012和2014(当前版本)中使用.Net 4.0/4.5新增的项;SQL Server 2005/2008/2008 R2被困在.Net 2.0系列上

  • 我知道这是一个老生常谈的问题,但本周早些时候我也在写一个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();