【问题标题】:EntLib and SQLCLR?EntLib 和 SQLCLR?
【发布时间】:2011-02-25 02:59:19
【问题描述】:

我的 MSSQL 2008 DB 中有很多 SQLCLR 函数和存储过程。调试和记录总是一个问题。我在直接的 C# 应用程序中大量使用了 Microsoft Enterprise Library Logging Application Block,并且想知道是否 (1) 疯狂或 (2) 无法将其分层到 SQLCLR 内容中。我真的很喜欢使用配置文件为不同的事件定义滚动文本日志、事件日志和 SMTP 输出,所以如果有其他方法可以做到这一点,我会全力以赴...

谢谢。

【问题讨论】:

    标签: sql-server enterprise-library sqlclr


    【解决方案1】:

    似乎有可能。不知道好不好用。

    另一种方法是在代码中定义一个跟踪侦听器,它当然可以从数据库中读取配置。另一个简单的方法是将消息记录到 SQL 表中并使用触发器来启用通知。

    我也不得不质疑真正的错误是否是您的数据库中有 CLR 存储的过程,这些过程具有如此多的业务逻辑,以至于它们需要记录。我非常喜欢数据库中的业务逻辑,但我对 CLR 存储过程持谨慎态度。

    如果您想使用企业应用程序块,要编辑的配置文件将是 C:\Program Files\Microsoft SQL Server\MSSQL10.INSTANCE_NAME\MSSQL\Binn\sqlservr.config。但是,当您重新启动它时,sql server 似乎不会将值写入此文件。我通过以下 CLF PROC 和 UDF 得出了这个结论:

    using System;
    using System.Configuration;
    using Microsoft.SqlServer.Server;
    
    namespace LoggedClr
    {
    
        public static class AppDomainInfo
        {
    
            [SqlFunction]
            public static string GetConfigFileName()
            {
                return AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
            }
    
            [SqlFunction]
            public static string GetAppConfigValue(string key)
            {
                return ConfigurationManager.AppSettings[key];
            }
    
            [SqlProcedure]
            public static void SetAppConfigValue(string key, string value)
            {
                ConfigurationManager.AppSettings[key] = value;
    
            }
        }
    }
    

    我使用以下 T-SQL 加载并运行:

    CREATE DATABASE TestAssembly
    GO
    
    USE TestAssembly
    GO
    
    ALTER DATABASE TestAssembly SET TRUSTWORTHY ON;
    GO
    
    ALTER AUTHORIZATION ON DATABASE::TestAssembly TO test
    GO
    
    DROP ASSEMBLY LoggedClr 
    GO
    
    CREATE ASSEMBLY LoggedClr 
        from 'C:\justin''s projects\TestClr\LoggedClr\LoggedClr\bin\Debug\LoggedClr.dll' 
        WITH PERMISSION_SET = EXTERNAL_ACCESS
    GO
    
    CREATE FUNCTION GetConfigFileName () RETURNS NVARCHAR(MAX) AS 
        EXTERNAL NAME LoggedClr.[LoggedClr.AppDomainInfo].GetConfigFileName
    GO
    
    CREATE FUNCTION GetAppConfigValue (@key nvarchar(max)) RETURNS nvarchar(max) AS 
        EXTERNAL NAME LoggedClr.[LoggedClr.AppDomainInfo].GetAppConfigValue
    GO
    
    CREATE PROCEDURE SetAppConfigValue (@key nvarchar(max), @value nvarchar(max)) AS 
        EXTERNAL NAME LoggedClr.[LoggedClr.AppDomainInfo].SetAppConfigValue
    GO
    
    SELECT dbo.GetConfigFileName()
    EXEC dbo.SetAppConfigValue 'justin', 'is a developer'
    SELECT dbo.GetAppConfigValue('justin')
    

    这给了我以下结果:

    ------------------------------------------------------------------------------
    C:\Program Files\Microsoft SQL Server\MSSQL10.INSTANCE_NAME\MSSQL\Binn\sqlservr.config
    
    (1 row(s) affected)
    
    -------------------------------------------------------------------------
    is a developer
    
    (1 row(s) affected)
    

    【讨论】:

    • 我知道,我们 Entlib 团队甚至从未考虑过将它用于 SQL-CLR 环境。所以你在这里开辟了新天地。
    • @Chris,我也不推荐它。这个例子我只做了这么多,因为它看起来太不对了,我不得不尝试一下。
    猜你喜欢
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 2011-11-07
    相关资源
    最近更新 更多