2012-01-23 22 views
1

私はメソッドGetConnectionString()を追加しました。任意の値がSettingsクラスからのアクセスである場合はいつでも、例外をスローします。The type initializer for 'NameSpace.Settings' threw an exception. GetConnectionString()を削除するとすぐにプログラムは正常に動作します。'NameSpace.Settings'の型の初期化子が例外をスローしました

using System.Data.EntityClient; 
using System.Data.SqlClient; 

namespace CRM { 
static class Settings { 
    public static bool userAuthenticated = false; 

    public static string userGroup = ""; 
    public static Klienci currentlySelectedClient; 
    public static string sqlDataConnectionDetailsCRM = GetConnectionString(); 

    public static string GetConnectionString() { 
     string connection = ""; 

     SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder(); 
     sqlBuilder.InitialCatalog = dbInitialCatalog; 
     sqlBuilder.DataSource = dbServer; 
     sqlBuilder.IntegratedSecurity = false; 
     sqlBuilder.UserID = dbUserName; 
     sqlBuilder.Password = dbPasswWord; 
     sqlBuilder.MultipleActiveResultSets = true; 

     EntityConnectionStringBuilder entity = new EntityConnectionStringBuilder(); 
     entity.Metadata = @"res://*/Data.System.csdl|res://*/Data.System.ssdl|res://*/Data.System.msl"; 
     entity.Provider = "System.Data.SqlClient"; 
     entity.ProviderConnectionString = sqlBuilder.ToString(); 

     connection = entity.ToString(); 

     return connection; 
    } 
} 

}

私はsqlBuilderとエンティティをコメントアウトした場合。それはうまく動作します..

public static string GetConnectionString() { 
     string connection = ""; 

     SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder(); 
     //sqlBuilder.InitialCatalog = dbInitialCatalog; 
     //sqlBuilder.DataSource = dbServer; 
     //sqlBuilder.IntegratedSecurity = false; 
     //sqlBuilder.UserID = dbUserName; 
     //sqlBuilder.Password = dbPasswWord; 
     //sqlBuilder.MultipleActiveResultSets = true; 

     EntityConnectionStringBuilder entity = new EntityConnectionStringBuilder(); 
     //entity.Metadata = @"res://*/Data.System.csdl|res://*/Data.System.ssdl|res://*/Data.System.msl"; 
     //entity.Provider = "System.Data.SqlClient"; 
     //entity.ProviderConnectionString = sqlBuilder.ToString(); 

     connection = entity.ToString(); 

     return connection; 
    } 

何が起こっているのですか?

のInnerException:

例外=「System.ArgumentNullException:値は nullにすることはできません\ rを\ nParameter名:初期カタログます\ r \ nこれは

編集...私には罰金です System.Data.SqlClient.SqlConnectionStringBuilder.set_InitialCatalog(文字列 値)で\ Rは\ N CでCRM.Settings.GetConnectionString()で:プロジェクト\ \ Project.CS ..

public static string dbInitialCatalog = "BazaCRM";がSettingsクラスに設定されています。

+0

InnerExceptionに有用なデータはありますか? – ZombieSheep

+0

問題の内部例外が追加されました – MadBoy

答えて

2

初期化されるフィールドの順序は保証されません。ここでは、dbInitialCatalogフィールドの前にsqlDataConnectionDetailsCRMが初期化されています。

他の静的フィールドをconstに変更した場合は修正する必要があります。

また、公開されている静的フィールドを削除してメソッドから接続文字列を取得する方法や、Lazy<T>クラスを調べて最初に接続文字列を作成する方法があります必要です。

+0

変数をconstに変換すると問題なく動作します。静的フィールドの順序を変更しようとします(dbInitialCatalogの前にsqlDataConnectionDetailsCRMがあるので)。明確化のためにありがとう。注文が何かを意味するとは思わないでしょう:-) – MadBoy

+0

並べ替えフィールドに頼らないでください。それは動作しますが(http://msdn.microsoft.com/en-us/library/aa645758(v=vs.71).aspx)誰かがあなたのクラスをリファクタリングし、その重要性を認識していない可能性があります。 – Ray

2

エラーによると、dbInitialCatalogの値はnullと思われるため、接続文字列ビルダーはエラーをスローします。これはクラスの静的コンストラクタの内部にあるため、型自体はロードできず、すべてが失敗します。

手動で接続文字列を入力してみましたか?

+0

ありがとうございます。私はそれがスポットであったようにレイの答えを受け入れるだろう。 – MadBoy

関連する問題