【发布时间】: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