【问题标题】:Data Access in SQLCLR static class ConstructorsSQLCLR 静态类构造函数中的数据访问
【发布时间】:2017-10-13 22:42:27
【问题描述】:

在 SQL-CLR 程序集中..
有没有一种方法可以让我加载某些数据并可能在仅加载程序集时从数据库中读取?
假设我有一类用户定义的函数,这些函数使用一些正则表达式,必须根据我在数据库中的某些表中的数据构建和编译,有没有一种方法可以从表中读取,创建我的 Regex 对象并使这些对象在 AppDomian 的生命周期内保持活动状态,这样每当调用任何使用这些对象的用户定义函数时,就不必重新构建它们?

编辑:静态构造函数不是读取数据的有效上下文。

我希望我已经足够清楚了,提前致谢。

【问题讨论】:

  • Adham,你有没有在这方面取得进展?我知道我在这篇文章最初发布几年后才回答,但我很好奇这些信息是否有帮助。

标签: sql-server sqlclr


【解决方案1】:

有没有一种方法可以让我加载某些数据并可能在仅加载程序集时从数据库中读取?

这取决于您对“某些数据”的位置和/或程序集的PERMISSION_SET 的灵活程度。

如果程序集必须保持为SAFE(如果可能,这是首选),那么可以从程序集外部读取的仅有两个源是:

  • 环境变量
  • app.config 文件(有关详细信息,请参阅我对此 S.O. 问题的回答:Does SQL Server CLR Integration support configuration files?——是的,它也适用于 appSettings 部分)。 更新:到目前为止,从配置文件中读取似乎在 Linux 上不起作用(SQL Server 2017 的新平台)。

虽然这些都不像从该表中读取那样“动态”,但可以在该设置表上设置触发器以将适当的数据写入 sqlservr.exe.config 文件.对于高度事务性的表,我不会完全推荐它,但我在这里假设用于此目的的值不会经常更改,特别是因为计划无论如何都将它们缓存在 static readonly 类变量中。

如果程序集已经设置为EXTERNAL_ACCESS,那么您可以创建一个常规/外部SqlConnection 以从数据库中获取数据。但是,如果这是您将程序集设置为EXTERNAL_ACCESS唯一原因,那么我会选择上面提到的配置文件选项,因为如果程序集设置为,确定性方法的性能会更好SAFE.

【讨论】:

    【解决方案2】:

    我认为不同 SQL 服务器版本之间的行为会有所不同,但静态构造函数可能会有所帮助:http://msdn.microsoft.com/en-us/library/k9x6w0hc(v=vs.80).aspx

    【讨论】:

    • 这在 sql-clr 中不起作用,每当 Initializer 尝试进行数据访问时,都会引发 Context Invalid 异常。
    猜你喜欢
    • 2017-04-07
    • 2020-10-26
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 2018-01-12
    • 1970-01-01
    相关资源
    最近更新 更多