【问题标题】:Getting SQL Server CLR "Create Assembly" location from within the DLL itself从 DLL 本身中获取 SQL Server CLR“创建程序集”位置
【发布时间】:2017-02-05 21:30:42
【问题描述】:

程序集存储在数据库中,您可以这样获取注册位置:

SELECT af.name FROM sys.assemblies a
INNER JOIN sys.assembly_files af
        ON a.assembly_id = af.assembly_id
WHERE a.name = 'MyAssemblyName'

但是,我想在不询问 SQL Server 的情况下获取它,并且我想从正在运行的程序集中获取它。 Assembly.GetExecutingAssembly().Location 返回空白。 AppDomain.Current.BaseDirectory 返回 SQL Server 的 binn 路径。

当我使用CREATE ASSEMBLY 注册程序集时,我给了它一个路径。我想走那条路。

编辑(解决方案)

毕竟我不得不咨询数据库服务器。但这还不错,因为至少连接字符串不是硬编码的。

[SqlFunction(DataAccess = DataAccessKind.Read, SystemDataAccess = SystemDataAccessKind.Read)]
public static SqlString AssemblyLocation()
{
  using (var connection = new SqlConnection("context connection=true"))
  {
    var cmd = new SqlCommand($"SELECT af.name FROM sys.assemblies a INNER JOIN sys.assembly_files af ON a.assembly_id = af.assembly_id WHERE a.name = '{AssemblyName().Value}'", connection);
    connection.Open();
    return cmd.ExecuteScalar().ToString();
  }
}

[SqlFunction(DataAccess = DataAccessKind.Read, SystemDataAccess = SystemDataAccessKind.Read)]
public static SqlString AssemblyName()
{
  return typeof(StoredProcedures).Assembly.GetName().Name;
}

[SqlFunction(DataAccess = DataAccessKind.Read, SystemDataAccess = SystemDataAccessKind.Read)]
public static SqlString WebApiRoot()
{
  var config = ConfigurationManager.OpenExeConfiguration(AssemblyLocation().Value);
  return config.AppSettings.Settings["WebApiRoot"].Value;
}

【问题讨论】:

    标签: .net sql-server sqlclr


    【解决方案1】:

    从另一个答案中的 cmets,听起来您想要一个上下文连接。从文档中的示例:

    SqlConnection connection = new SqlConnection("context connection=true")
    

    【讨论】:

      【解决方案2】:

      当我使用CREATE ASSEMBLY 注册程序集时,我给了它一个路径。我想走那条路。

      这是不可能的,因为该路径仅用于将程序集读入数据库。您在sys.assembly_files 中看到的content 程序集/DLL。它现在物理地存在于数据库中。这就是CREATE ASSEMBLY 所做的。这比旧的扩展存储过程 (XPs) 框架有优势,因为没有外部依赖项;当您备份数据库时,Assembly 将与它一起备份,因为数据驻留在数据库中,而不是文件系统中。

      【讨论】:

      • 那么我可以调用一些东西来获取我所在的 sql server 实例,这样我就不必硬编码或从配置中获取它了吗?从 Config 中获取 conn 字符串将追逐我的尾巴 b/c 获取路径的全部目的是访问 dll 的配置文件。谢谢。
      • @toddmo:来自文档中的示例:SqlConnection connection = new SqlConnection("context connection=true")
      • @BenThul,做到了。你能添加一个答案吗?
      • @toddmo 什么?您的问题从未说过任何接近“配置文件”的内容。如果这是目标,你为什么不提呢?与为未使用的 DLL 和不需要存在的路径使用配置文件相比,可能有更好的整体解决方案。
      • 虽然没有更好的解决方案来使用配置文件。我需要那条路。
      猜你喜欢
      • 1970-01-01
      • 2012-05-23
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      相关资源
      最近更新 更多