gpt4 book ai didi

c# - 从 SQL Server 2005 中提取 .NET 程序集

转载 作者:可可西里 更新时间:2023-11-01 03:05:53 24 4
gpt4 key购买 nike

我正在尝试通过 SQL CLR 帮助一位私有(private) friend (现在也是客户)相关问题。他有一个带有 3 个 .NET 程序集的数据库的 SQL Server嵌入其中。他让我帮他从里面提取程序集数据库并将它们保存为磁盘上的 .dll 文件。这可能吗?

最佳答案

是的,这是可能的。程序集的实际二进制表示形式在您的服务器的 SQL 目录中。即,如果您在之间运行连接sys.assembly_files 和 sys.assemblies 您可以获得所有信息需要。程序集二进制文件位于 sys.assembly_files 的内容列中看法。

但是为了从 SQL Server 中提取二进制表示形式并将其转换为磁盘上的文件,您将不得不编写一些需要在磁盘上运行的 .NET 代码您引用的程序集现在所在的同一数据库。在视觉上Studio 启动一个 SQL CLR 项目并使用以下代码向其添加一个类:

using System;
using System.IO;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Security.Permissions;

namespace ExtractSqlAssembly {
[PermissionSet(SecurityAction.Demand, Unrestricted = true, Name = "FullTrust")]
public partial class SaveSqlAssembly {

[SqlProcedure]
public static void SaveAssembly(string assemblyName, string path) {
string sql = @"SELECT AF.content FROM sys.assembly_files AF JOIN sys.assemblies A ON AF.assembly_id = A.assembly_id where AF.file_id = 1 AND A.name = @assemblyname";
using (SqlConnection conn = new SqlConnection("context connection=true")) {
using (SqlCommand cmd = new SqlCommand(sql, conn)) {
SqlParameter param = new SqlParameter("@assemblyname", SqlDbType.VarChar);
param.Value = assemblyName;
cmd.Parameters.Add(param);

cmd.Connection.Open(); // Read in the assembly byte stream
SqlDataReader reader = cmd.ExecuteReader();
reader.Read();
SqlBytes bytes = reader.GetSqlBytes(0);

// write the byte stream out to disk
FileStream bytestream = new FileStream(path, FileMode.CreateNew);
bytestream.Write(bytes.Value, 0, (int)bytes.Length);
bytestream.Close();
}
}
}
}
}

然后构建项目并将其部署到您的数据库。确保 CLREnabled 配置选项已在 SQL Server 上启用。这大概是已经启用,因为你上面有程序集。如果 clr 执行不是已启用您可以在 SSMS 上运行以下代码以启用它:

sp_configure 'clr enabled', 1
go

reconfigure
go

您需要注意的另一件事是默认情况下 SQL 服务器可能不允许您从 .NET 代码写入磁盘。如果你得到一个 FileIO通过调用存储过程运行上面的代码时出现安全错误SSMS,您需要为部件。您可以通过 SSMS 执行此操作:右键单击新程序集并查看属性对话框中的权限集。将其设置为外部访问。现在轮到你应该能够通过在 SSMS 中运行以下代码来导出程序集:

exec SaveAssembly 'AssemblyName', 'f:\path\to\assemblyname.dll'

希望这对你有用...

关于c# - 从 SQL Server 2005 中提取 .NET 程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4103406/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com