2009-05-18 17 views
3

エラー調査をさらにサポートするために、ELMAHを既存のASP.NETアプリケーションに統合しようとしています。 。アプリケーションがデプロイされているすべての環境に単一のweb.configファイルを使用し、実行時には、アプリケーションがどの環境にあるかを、通常はURLに基​​づいて決定します。Elmah - ASP.NET - >複数の接続文字列 - >コードにSQLエラーログの接続文字列を設定する

これは...標準ブロックは、私たちのためのように希望のものをELMAHで

<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> 
    <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="TESTAppDB"/> 
</elmah> 

が、私はPRODにいる場合:たとえば、私がテストしていた場合、私は、この欲しい

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

EDIT Webアプリケーションのための
展開慣行が出てもいます私がしようとしていることの範囲。 ELMAH Sqlエラーログのデータソースを変更できるコードソリューションが必要です。

私たちは現在、Webアプリケーションの展開方法を変更できません。つまり、TESTにあるものは何でもCERTに移ります。 CERTの何がPRODに移ります。 Webアプリケーションは、それがどのような環境にあるかを判断できなければなりません。

答えて

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プロパティを設定するように更新するだけです。

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

をした後:

string connectionString = ConnectionStringHelper.GetConnectionString(config); 

SqlErrorLog(IDictionaryを設定)コンストラクタに追加し、彼の変化に加えて、ルーングリムスターの答えに構築するには

+0

良いコードを取得する機能を呼び出します。私はCustomConnectionStringをGlobal.asax Session_Startから設定し、その魅力のように働いています! – RSolberg

+0

これに助けてくれてありがとう。 – RSolberg

+0

実際にELMAHを修正するにはメンテナンスの手間がかかるかもしれません。 SqlErrorLogから新しいクラスを継承して変更できますか? –

0

私は1つの接続文字列名 "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"を参照してください。

+0

同じルールが適用されます。すべての環境で同じファイルを展開する必要があります。その理想ではない、私はそれを知っているが、私が支配するものではない。 – RSolberg

4

私はこのためにWeb Deployment Projectを使用します。各構成(デフォルトではデバッグとリリース)の接続文字列を含むファイルを指定することができます。このように、すべてのデプロイメント用のすべてのコンフィグファイルには同じファイルがあり、web.configはデプロイメントごとに適切に更新されます。

スコット区はここで良い情報があります:http://weblogs.asp.net/scottgu/archive/2005/11/06/429723.aspx

それは、以前のリリースのためですが、情報がまだ適用されます。

+1

Seconded。私は最近の私のプロジェクトでスコットの助言に従いました。それはとてもうまくいきます! –

+0

質問に追加情報を追加しますが、展開の問題になることはわかっていましたが、それは問題の問題ではなく、少なくとも解決しなければならない問題ではありません。 – RSolberg

0

は、その後、私はRSolbergがやったことでしたが、のApplication_Startでのセッションとは対照的に、:

Elmah.SqlErrorLog.CustomConnectionString = "あなたのCS"。

0

この場合、データベースコンテキストを使用できますか?

(上記の実施例に係る)Iは、MVC 3でWebアプリケーションを持っていると私は、データベースコンテキストを使用してデータベースへの接続:

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

Iは相互に接続する場合データベースなので、私は書いています:

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

正しいと思われる...

関連する問題