Elmah - ASP.NET - >多个连接字符串 - >在代码中设置SQL错误日志连接字符串

时间:2009-05-18 17:54:34

标签: asp.net connection-string elmah

我希望将ELMAH集成到现有的ASP.NET应用程序中,以进一步支持错误调查,并可以使用连接字符串的一些帮助。我们对部署应用程序的所有或我们的环境使用单个web.config文件,并且在运行时,应用程序通常根据URL决定它所在的环境。

这就是我们想要的标准块......

  <connectionStrings>
    <add name="TESTAppDB" connectionString="Data Source=SQL-T-APPNAME.COMPANY.COM;Initial Catalog=APPNAME;User ID=USER;Password=THEPASS" providerName="System.Data.SqlClient"/>
    <add name="CERTAppDB" connectionString="Data Source=SQL-C-APPNAME.COMPANY.COM;Initial Catalog=APPNAME;User ID=USER;Password=THEPASS" providerName="System.Data.SqlClient"/>
    <add name="PRODAppDB" connectionString="Data Source=SQL-P-APPNAME.COMPANY.COM;Initial Catalog=APPNAME;User ID=USER;Password=THEPASS" providerName="System.Data.SqlClient"/>
  </connectionStrings>

使用Elmah,您似乎只需要指定连接字符串的名称,但是如何在运行时动态执行此操作?例如,如果我正在测试,那么我想要这个:

<elmah>
     <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="TESTAppDB"/>
</elmah>

但如果我在PROD:

<elmah>
     <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="PRODAppDB"/>
</elmah>

修改
Web应用程序的部署实践远远超出了我正在尝试的范围。我需要一个代码解决方案,允许我更改ELMAH Sql错误日志的数据源...

我无法改变今天部署网络应用的方式。这意味着,无论在TEST中,移动到CERT。什么在CERT移动到PROD。 Web应用程序必须能够确定它所在的环境并以此形式运行...

5 个答案:

答案 0 :(得分:4)

我为此使用Web部署项目。您可以为每个配置指定一个带有连接字符串的文件(默认情况下为Debug和Release)。这样,所有部署的所有配置文件都具有相同的文件,并且每个部署都会相应地更新web.config。

Scott Gu在这里有一个很好的信息:http://weblogs.asp.net/scottgu/archive/2005/11/06/429723.aspx

这是针对之前的版本,但信息仍然适用。

答案 1 :(得分:4)

由于Elmah是开源的,因此很容易添加自己的: - )

您需要做的就是向SqlErrorLog类添加一个新的静态属性,该类包含您想要使用的连接字符串,然后您将更新SqlErrorLog.ConnectionString属性以返回您的自定义连接字符串,如果它有一个值。

尝试在课堂上添加类似的内容(警告 - 未经测试的代码):

public static string CustomConnectionString { get; set; }

public virtual string ConnectionString
{
  get 
  { 
    if (string.IsNullOrEmpty(CustomConnectionString)) 
    {
      return _connectionString;
    }
    else
    {
      return CustomConnectionString; 
    }
  }
}

这应该足够了。现在,您所要做的就是找到选择连接字符串的位置并更新它以设置SqlErrorLog.CustomConnectionString属性。

答案 2 :(得分:0)

我会使用一个连接字符串名称“AppDB”,但实际上在外部(web.config文件之外)配置文件中托管连接字符串,这在每个环境中都是不同的。

在你的web.config中:

<connectionStrings configSource="config\connectionStrings.config"/>

然后,在connectionStrings.config文件中:

<connectionStrings>    
    <add name="AppDB" connectionString="Data Source=SQL-T-APPNAME.COMPANY.COM;Initial Catalog=APPNAME;User ID=USER;Password=THEPASS" providerName="System.Data.SqlClient"/>
</connectionStrings>

然后,根据connectionStrings.config文件所处的环境,修改connectionString。在代码中,只需参考“AppDB”。

答案 3 :(得分:0)

以Rune Grimstad的答案为基础,除了他的修改之外,还要加上:

if (connectionString.Length == 0)
    connectionString = CustomConnectionString;

后:

string connectionString = ConnectionStringHelper.GetConnectionString(config);

在SqlErrorLog(IDictionary config)构造函数中。

然后我做了RSolberg所做的事情,但是在application_start而不是session:

Elmah.SqlErrorLog.CustomConnectionString =“你的CS”;

答案 4 :(得分:0)

我们可以在这种情况下使用数据库上下文吗?

我在MVC 3中有一个webapp,我用数据库上下文连接数据库(根据上面的例子):

using (var ctx = new TESTAppDB())
{
    var res = (from p in ctx.Customer select p).FirstOrDefault();
}

TESTAppDB:

public class TESTAppDB: DbContext
{
    public DbSet<Customer> Customer{ get; set; }
}

如果我想连接到另一个数据库,那么我写道:

using (var ctx = new CERTAppDB())
{
    var res = (from p in ctx.Order select p).FirstOrDefault();
}

似乎是正确的......