从 DLL 本身获取 SQL 服务器 CLR "Create Assembly" 位置
Getting SQL Server CLR "Create Assembly" location from within the DLL itself
程序集保存在数据库中,可以这样获取注册位置:
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 服务器的情况下获取它,并且我想从 运行 程序集中获取它。 Assembly.GetExecutingAssembly().Location
returns 空白。 AppDomain.Current.BaseDirectory
returns SQL 服务器的 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;
}
When I registered the assembly with CREATE ASSEMBLY
, I gave it a path. I'd like to get that path.
这是不可能的,因为该路径仅用于将程序集读入数据库。您在 sys.assembly_files
中看到的 content
列是 程序集/DLL。它现在实际存在于数据库中。这就是 CREATE ASSEMBLY
所做的。与旧的扩展存储过程 (XP) 框架相比,这是一个优势,因为它没有外部依赖性;当您备份数据库时,程序集也会随之备份,因为数据驻留在数据库中,而不是文件系统中。
从另一个答案的评论来看,您似乎想要上下文连接。来自文档中的示例:
SqlConnection connection = new SqlConnection("context connection=true")
程序集保存在数据库中,可以这样获取注册位置:
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 服务器的情况下获取它,并且我想从 运行 程序集中获取它。 Assembly.GetExecutingAssembly().Location
returns 空白。 AppDomain.Current.BaseDirectory
returns SQL 服务器的 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;
}
When I registered the assembly with
CREATE ASSEMBLY
, I gave it a path. I'd like to get that path.
这是不可能的,因为该路径仅用于将程序集读入数据库。您在 sys.assembly_files
中看到的 content
列是 程序集/DLL。它现在实际存在于数据库中。这就是 CREATE ASSEMBLY
所做的。与旧的扩展存储过程 (XP) 框架相比,这是一个优势,因为它没有外部依赖性;当您备份数据库时,程序集也会随之备份,因为数据驻留在数据库中,而不是文件系统中。
从另一个答案的评论来看,您似乎想要上下文连接。来自文档中的示例:
SqlConnection connection = new SqlConnection("context connection=true")