当前位置: 首页 > 知识库问答 >
问题:

在C#中,我通过创建文件夹和clr存储过程中不存在的文件来将数据写入xml文件

欧金鹏
2023-03-14

我在尝试这个;

public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void ExportXML_v1_2(string file_path, string file_name, string xml_data, out int status, out string error_messages)
    {
        string Folder1 = file_path;
        string xml = xml_data;
        error_messages = "";
        status = 0;
        try
        {
            if (!Directory.Exists(Folder1))
            {
                Directory.CreateDirectory(Folder1);
            }

我得到了这个错误;

System.Security.SecurityException:请求类型为“System.Security.Permissions.FileOpermission,mscorlib,Version=4.0.0.0,Culture=Neutral,PublicKeyToken=B77A5C561934E089”得权限失败。StoredProcedures.ExportXML_V1_2(String file_path,String file_name,String xml_data,Int32&status,String&error_messages)中的System.SecurityCodeAccessSecurityEngine.Check(Object demand,StackCrawlMark&stackMark,Boolean isPermSet)中的System.Security.CodeAccessPermission.demand()

失败的操作为:Demand失败的第一个权限的类型
为:System.Security.Permissions.FileIopermission
失败的程序集的区域为:MyComputer

共有1个答案

於德馨
2023-03-14

您需要用PERMISSION_SET=external_access将程序集标记为。为了做到这一点,您需要:

  1. 为程序集签名
  2. 在主服务器中创建非对称密钥
  3. 从该非对称密钥创建登录
  4. 授予该登录名外部访问程序集权限

当然,根据您是否使用Visual Studio/SSDT,特别是根据SQL Server2017中最近引入的更改,您可能会在如何执行此操作方面有一些变化。有关详细信息,请参阅我撰写的两篇博文,其中详细介绍了实现这一目标的两种方法,一种是在Visual Studio中完全自动化,另一种是在SQL Server 2017的新“CLR严格安全”约束下工作:

  • SQLCLR与SQL Server 2017,第2部分:“CLR严格安全性”-解决方案1
  • SQLCLR与SQL Server 2017,第3部分:“CLR严格安全性”-解决方案2

此外,在使用SQLCLR时,不应将string类型用作输入/输出参数类型。您应该使用适当的SQL*类型,在本例中是SQLString。然后,通过value属性获取实际的字符串值。对于xml_data参数,使用sqlxml类型,因为您可以从它创建一个XmlReader,这不仅会稍微快一点,而且还可以更好地处理编码的更改(最有可能是UTF-8),以及正确处理顶部的 声明。例如:

public static void ExportXML_v1_2(SqlString file_path, SqlString file_name,
   SqlXml xml_data, out int status, out SqlString error_messages)
{
    if (file_path.IsNull)
    {
       error_messages = "@file_path cannot be NULL.";
       return;
    }

    string Folder1 = file_path.Value;

有关一般使用SQLCLR的更多信息,请参阅我正在编写的有关SQL Server Central:Stairway to SQLCLR(特别是Level 5)的系列文章。

此外,SQL#(我编写的)中还提供了FWIW函数,该函数将XML保存到文件中,处理格式化(例如缩进等),追加与覆盖以及编码(包括在 声明中指定)。这个函数是XML_SaveToFile,虽然许多函数在免费版本中可用,但是这个特定的函数只有在完整(即付费)版本中可用。

 类似资料:
  • 我想在GitHub资源库中创建一个文件夹,并想在该文件夹中添加文件。我如何实现这一点?

  • 我使用Maven构建了一个Jar。我试图实现的行为是:当用户使用命令create时,我想在JAR的一个文件夹中存储一个XML文件。有可能做到吗? 假设这是一个项目,我将迁移工具的jar添加到其中。我希望能够看到和编辑属性文件

  • 迁移到Android Q后,我再也找不到合适的方法来获得对documents文件夹()的写访问权限 null null

  • 这可以通过元数据实现吗?当在父文件夹中创建一个新文件/文件夹时,我是否也可以通过编程方式更新父文件夹的元数据,以便说:“嘿,在这个文件夹中有这些特定的文件?”

  • 问题内容: 我的一位客户要求为成千上万种不同格式(例如pdf,doc,docx等)的文档提供文档管理系统。我的问题是在数据库或文件系统中存储此文件的最佳方法是什么?两种方法之间如何轻松保护文档? 快速检索文件是关键要求。 我正在使用mysql如果有帮助 问候。 问题答案: 您可能希望将其直接存储到文件系统中。 使用文件系统时,请注意: 机密性: 将文档放在Apache文档根目录之外。然后,您的PH

  • 问题内容: 我试图在我的android应用中的所有视图中始终使用相同的尺寸(例如,左边界为20dp)。如果我使用的是HTML,我只会使用CSS文件,但是我对如何在Android上执行此操作一无所知。 有没有一种方法可以将该值存储在res / values中的xml文件中,然后在布局中使用它? 例如,我想像将它们存储在strings.xml中 然后在layout.xml中使用以下文本 但我不确定它是

  • 我想在我新创建的GitHub存储库中添加一个新文件夹,而不安装用于(Mac、Linux和Windows)的Git设置。有可能这样做吗? 当我在不同的系统/机器上工作时,我不能让Git一直陪伴在我身边。我知道如何在上的存储库中直接添加文件。我们也可以创建一个文件夹吗?

  • 是否有方法通过使用azure函数备份cosmos DB并将.JSON文件保存在azure blob存储中