2010-04-30 2 views
0

Я использую VS2008. У меня есть проект, SystemSoftware проект, подключитесь к базе данных, и мы используем L2E. У меня есть класс RuntimeInfo, который содержит некоторую общую информацию. Это выглядит следующим образом:C#, не могу понять эту ошибку?

public class RuntimeInfo 
    { 
     public const int PWD_ExpireDays = 30; 

     private static RuntimeInfo thisObj = new RuntimeInfo(); 

     public static string AndeDBConnStr = ConfigurationManager.ConnectionStrings["AndeDBEntities"].ConnectionString; 

     private RuntimeInfo() { 

     } 

     /// <summary> 
     /// 
     /// </summary> 
     /// <returns>Return this singleton object</returns> 
     public static RuntimeInfo getRuntimeInfo() 
     { 
      return thisObj; 
     } 
} 

Теперь я добавил помощник проект, AndeDataViewer, к решению, которое создает простой интерфейс для отображения данных из базы данных для тестирования/проверка цели.

Я не хочу создавать другой набор Entity Data Model в вспомогательном проекте. Я просто добавил все связанные файлы в качестве ссылки в новом проекте-помощнике.

В проекте AndeDataViewer, я получаю connection string сверху RuntimeInfo класса, который является классом от моего SystemSoftware проекта в качестве связанного файла. Код в AndeDataViewer, как это:

public class DbAccess : IDisposable 
    { 
     private String connStr = String.Empty; 
     public DbAccess() 
     {   
      connStr = RuntimeInfo.AndeDBConnStr; 
     } 
} 

Мои SystemSoftware работает отлично это означает, что RuntimeInfo класс не имеет никаких проблем там. Но когда я бегу мой AndeDataViewer, оператор внутри выше конструктора,

connStr = RuntimeInfo.AndeDBConnStr; 

, бросает исключение. Исключение копируется здесь:

System.TypeInitializationException was unhandled 
    Message="The type initializer for 'MyCompany.SystemSoftware.SystemInfo.RuntimeInfo' threw an exception." 
    Source="AndeDataViewer" 
    TypeName="MyCompany.SystemSoftware.SystemInfo.RuntimeInfo" 
    StackTrace: 
     at AndeDataViewer.DbAccess..ctor() in C:\workspace\SystemSoftware\Other\AndeDataViewer\AndeDataViewer\DbAccess.cs:line 17 
     at AndeDataViewer.Window1.rbRawData_Checked(Object sender, RoutedEventArgs e) in C:\workspace\SystemSoftware\Other\AndeDataViewer\AndeDataViewer\Window1.xaml.cs:line 69 
     at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs) 
     .... 
InnerException: System.NullReferenceException 
     Message="Object reference not set to an instance of an object." 
     Source="AndeDataViewer" 
     StackTrace: 
      at MyCompany.SystemSoftware.SystemInfo.RuntimeInfo..cctor() in C:\workspace\SystemSoftware\SystemSoftware\src\systeminfo\RuntimeInfo.cs:line 24 
     InnerException: 

Я не могу понять это, потому что это выглядит хорошо для меня, но почему существует исключение? мы не можем получить доступ к статической переменной, если класс является связанным классом? Связанный класс должен быть таким же, как местный класс, я думаю. «Связанный» здесь означает, что когда я добавляю файл, я использую «Добавить как ссылку».

как я могу избежать этого исключения?

EDIT: 

Я добавил файл App.config SystemSoftware в AndeDataViewer как ссылку. Затем исправил эту проблему, но мне это не нравится. Как насчет того, есть ли у меня App.config? Я не хочу вручную копировать строку соединения там, потому что «вручную» означает «нет».

для тех, кто имеет несколько проектов имеют одну базу данных, эта ссылка может быть helperful, когда у вас есть проблемы: MetadataException: Unable to load the specified metadata resource

+0

Какой тип данных «ConfigurationManager.ConnectionStrings»? Я предполагаю 'Dictionary ', но зачем вам нужно извлекать из него ConnectionString? – Powerlord

+0

Что касается зависимостей, вы можете заставить 'AndeDataViewer' иметь' SystemSoftware' в качестве зависимости, а затем обращаться к своим объектам через пространство имен SystemSoftware, хотя вам также необходимо сделать публичную публикацию 'RuntimeInfo'. – Powerlord

ответ

3

Вы увидите это, если ваш файл приложения .config не определяет имя соединения строки «AndeDBEntities».

Линия

public static string AndeDBConnStr = 
     ConfigurationManager.ConnectionStrings["AndeDBEntities"].ConnectionString; 

ли доступ к ConnectionString свойство объекта, возвращаемого ConnectionStrings["AndeDBEntities"], который не может существовать.

+0

Является ли это в моем AndeDataViewer Мне нужно иметь ссылку на файл App.config проекта SystemSoftware? – 5YrsLaterDBA

+0

Ссылки в проекте действительно не имеют никакого отношения к времени выполнения. Когда у вас есть проект App.config, Visual Studio копирует его в папку сборки и переименовывает его AssemblyName.ext.config. Таким образом, это не обязательно должно быть в проекте, но оно должно присутствовать везде, где вы пытаетесь использовать приложение. –

0

У вас есть исключение в вашем статическом конструкторе. создайте его явно и переместите туда все статические инициализаторы. затем debug :)

0

Проект AndeDataViewer не имеет записи о конфигурации. Предполагая, что это приложение Winforms, вам нужен app.config, определенный в этом проекте.

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