elmah -asp.net-> 다중 연결 문자열 -> 코드에서 SQL 오류 로그 연결 문자열 설정

StackOverflow https://stackoverflow.com/questions/878987

문제

나는 통합을 찾고있다 엘마 기존 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>

편집하다
웹 애플리케이션을위한 배포 관행은 내가하려는 일에 대한 범위가 좋지 않습니다. Elmah SQL 오류 로그의 데이터 소스를 변경할 수있는 코드 솔루션이 필요합니다 ...

오늘 웹 앱을 배포하는 방식을 변경할 수 없습니다. 즉, 테스트중인 것이 무엇이든 Cert로 이동합니다. CERT의 내용은 Prod로 이동합니다. 웹 앱은 어떤 환경이 있는지 결정하고 실행할 수 있어야합니다 ...

도움이 되었습니까?

해결책

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 재산.

다른 팁

이를 위해 웹 배포 프로젝트를 사용합니다. 각 구성에 대해 연결 문자열이있는 파일을 지정할 수 있습니다 (기본적으로 디버그 및 릴리스). 이러한 방식으로 모든 배포에 대한 모든 구성 파일에는 동일한 파일이 있으며 Web.Config는 각 배포에 대해 적절하게 업데이트됩니다.

Scott Gu는 여기에 좋은 정보를 가지고 있습니다. http://weblogs.asp.net/scottgu/archive/2005/11/06/429723.aspx

이전 릴리스를위한 것이지만 정보는 여전히 적용됩니다.

하나의 연결 문자열 이름 "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"만 참조하십시오.

Rune Grimstad의 답변을 구축하려면 그의 변경 외에도 다음을 추가하십시오.

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

후에:

string connectionString = ConnectionStringHelper.GetConnectionString(config);

sqlerrorlog (idictionary config) 생성자에서.

그런 다음 Rsolberg가 한 일을했지만 세션이 아닌 Application_start에서 :

Elmah.sqlerrorlog.customConnectionstring = "귀하의 CS";

이 경우 데이터베이스 컨텍스트에서 사용할 수 있습니까?

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();
}

맞는 것 같습니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top