Инициализатор типа для NameSpace.Settings вызвал исключение - PullRequest
1 голос
/ 23 января 2012

У меня очень простой класс, в который я добавил метод GetConnectionString(). После добавления этого значения при доступе к любому значению из класса «Настройки» возникает исключение The type initializer for 'NameSpace.Settings' threw an exception.. Как только я удаляю GetConnectionString (), программа работает нормально.

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

Что происходит? Мне кажется, это нормально ..

Edit:

InnerException:

exception = "System.ArgumentNullException: значение не может быть null. \ r \ nИмя параметра: начальный каталог \ r \ n в System.Data.SqlClient.SqlConnectionStringBuilder.set_InitialCatalog (String значение) \ r \ n в CRM.Settings.GetConnectionString () в C: \ Проекты \ Project.C.S ...

Пока public static string dbInitialCatalog = "BazaCRM"; установлено в классе Настройки.

Ответы [ 2 ]

2 голосов
/ 23 января 2012

Порядок инициализации полей не гарантируется.Здесь происходит то, что sqlDataConnectionDetailsCRM инициализируется перед полем dbInitialCatalog.

Если вы измените эти другие статические поля на const, это должно исправить это.

Илилучшим способом может быть просто удалить ваше общедоступное статическое поле и извлечь строку соединения из метода, или вы также можете исследовать класс Lazy<T> и использовать его для построения строки соединения:в первый раз это необходимо.

2 голосов
/ 23 января 2012

В соответствии с вашей ошибкой значение dbInitialCatalog кажется нулевым, поэтому построитель строки подключения выдает ошибку. Поскольку это внутри статического конструктора класса, сам тип не может быть загружен, и все это терпит неудачу.

Вы сами пытались указать строку подключения самостоятельно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...