2012-01-23 6 views
1

У меня очень простой класс, который я добавил в метод GetConnectionString(). После добавления его всякий раз, когда любое значение получает доступ из класса «Настройки», оно генерирует исключение 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; 
    } 

Что происходит? Кажется, хорошо для меня ..

Edit:

InnerException:

исключение = «System.ArgumentNullException: Значение не может быть нуль \ г \ nParameter. Имя: Initial Catalog \ г \ п на System.Data.SqlClient.SqlConnectionStringBuilder.set_InitialCatalog (String значение) \ г \ п на CRM.Settings.GetConnectionString() в C: \ Проекты \ Project.CS ..

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

+0

Есть ли какие-либо полезные данные в InnerException? – ZombieSheep

+0

Добавлено внутреннее исключение в вопросе – MadBoy

ответ

2

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

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

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

+0

Переключение переменных в const работает нормально. Я также попытаюсь изменить порядок статических полей (так как у меня есть sqlDataConnectionDetailsCRM до dbInitialCatalog). Спасибо за разъяснение. Не подозревал, что порядок будет означать что-то здесь :-) – MadBoy

+0

Не полагайтесь на переупорядочивающие поля. Хотя он [будет работать] (http://msdn.microsoft.com/en-us/library/aa645758 (v = vs.71) .aspx), кто-то может прийти и реорганизовать ваш класс и не осознавать его значимости. – Ray

2

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

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

+0

Спасибо. Я соглашусь с ответом Рэй, как было на месте. – MadBoy

Смежные вопросы