2015-04-16 5 views
3

Я искал в Google и Stack Overflow для этой проблемы, которую у меня есть. К сожалению, я не могу найти правильный ответ на мою проблему.C# Свойство get set не устанавливает значение

Вначале я буду показывать свои классы и App.config.

Класс: Form1: Form

public partial class Form1 : Form 
{ 
    Database db = new Database(); 

    public Form1() 
    { 
     InitializeComponent(); 
     db.Test(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     db.MdfConnectionString = ConfigurationManager.ConnectionStrings["MDFConnection"].ConnectionString; 
    } 
} 

Класс: База данных

class Database 
{ 
    private string _mdfConnectionString; 

    public string MdfConnectionString 
    { 
     get { return this._mdfConnectionString; } 
     set { this._mdfConnectionString = value; } 
    } 

    public void Test() 
    { 
     MessageBox.Show(_mdfConnectionString); 
    } 

App.config

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <connectionStrings> 
     <add name="MDFConnection" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|Database\AutoFill.mdf;Integrated Security=True;ApplicationIntent=ReadOnly" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 
    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
    </startup> 
</configuration> 

В моем классе Database.cs У меня есть MessageBox.Show (_mdfConnectionString);, который покажет приватную строку (поле поддержки), но по какой-то нечетной причине _mdfConnectionString всегда имеет значение null.

Я объявил в своем классе Form1: Form, что ему нужно загрузить строку подключения в моем App.config.

Не забудьте упомянуть, что ConfigurationManager.ConnectionStrings ["MDFConnection"]. ConnectionString; сам возвращает значение, так что здесь не проблема.

Надеюсь, что кто-то может помочь мне в решении этой проблемы.

EDIT 1

Изменен код, чтобы сделать его более понятным для людей. Также ExecuteQuery не имеет значения, поэтому я сделал простой метод в классе Database.cs, вызывающем Message Box.

Также исполняемые и Exe.config находятся в одной и той же папке во время выполнения.

+9

Первое, что нужно узнать, это автоматически реализуемые свойства - вы можете избавиться от объявления своего поля и переписать свое свойство как 'public string MdfConnectionString {get; задавать; } ' –

+2

Вы отлаживали код, чтобы узнать, действительно ли ваш метод Form1_Load? Вы проверили, что это связано с событием? Возможно, вы используете 'db' до того, как форма закончила загрузку? –

+0

Вызывается Form_Load1, используется Message Box и точки останова. Я попытаюсь использовать свойства Auto-Implement. – Roemy

ответ

3

У меня нет точного ответа, но есть несколько вопросов, которые я бы спрашивать себя в Такая же ситуация.

  1. Действительно ли линия связи получена? т. е. разбить решение для отладки, добавить точку останова на myConn, как показано ниже.

    частная пустота Form1_Load (объект отправителя, EventArgs е) {

    вар myConn = ConfigurationManager.ConnectionStrings [ "MDFConnection"] ConnectionString. ДБ.MdfConnectionString = myConn;

    }

  2. Ваше текущее решение по конструкции позволяет классу datatbase быть использованы без строки соединения. Было бы лучше поставить связь в конструктор, чтобы устранить потенциальную ошибку? Например.

    общественного класса Database {

    частная строка _mdfConnectionString;

    общественность базы данных (строка соппы)

    {

    _mdfConnectionString = соппы;

    }

    ...

    }

Вы можете затем хотите построить его на форме нагрузки.

  1. С веб-материалом, иногда вы не работаете с экземпляром, с которым, по вашему мнению, работаете. Если все остальное не удастся, вы можете попробовать изменить класс на singleton, но стиль Injection Dependency должен быть лучше.

EDIT - после вашего редактирования, я считаю, что вы сейчас вызываете Тест перед загрузкой формы. Попробуйте указать пункт 2 (введите строку соединения в конструктор), а затем вы знаете, что не можете иметь экземпляр класса без строки подключения. Я пробовал ваш класс в консоли, и это нормально, поэтому проблема, скорее всего, будет порядком загрузки. DI исправит это.

+0

Мне всегда говорили не использовать синглтон базы данных, особенно не в webinstance. – Cageman

+0

@hockeyJ 1. Получено. Также при этом: 'db.MdfConnectionString =« Test Weeeeee »' все равно приводит к null. 2. Я закрою этот пробел позже, чтобы он не удался, когда строка соединения не определена, спасибо за показ мне :) – Roemy

+0

@Roemy - если у вас есть соединение, попробуйте передать его в конструкторе. Тогда вы не сможете иметь экземпляр класса без строки подключения. Cageman - Я согласен с тем, что не использую синглтоны в конечном продукте. Это подразумевалось как исследовательская помощь в случае, если Ромей не обращается к тому, которого он ожидает. Извините, если это не ясно. – HockeyJ

0

Когда вы называете метод? Юст глядя на свой код он любит в конструкторе, так initializise строки в конструкторе:

public Form1() 
{ 
    db.MdfConnectionString = ConfigurationManager.ConnectionStrings["MDFConnection"].ConnectionString; 
    InitializeComponent(); 
} 
+0

Я уже пробовал, и это тоже не работает. Значение остается null – Roemy

+0

Как HockeyJ сказал (точка 1), проверьте, имеет ли соединениестрока был загружен при загрузке. – Cageman

0

Form1: Form

public partial class Form1 : Form 
{ 
    Database db = new Database(); 

    public Form1() 
    { 
     InitializeComponent(); 
     //db.Test(); // Removed! 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     db.MdfConnectionString = ConfigurationManager.ConnectionStrings["MDFConnection"].ConnectionString; 
     db.Test(); // Returns a value! :D 
    } 
} 

Кажется, я загружал свои методы, прежде чем загружать саму форму.

+0

Обратите внимание, что обычно вы не должны сами писать ответ. Вместо этого примите ответ, который помог вам, возможно, прокомментируйте, какая часть ответа вам помогла. Дело в том, что это не форум, поэтому ответы не будут оставаться в одном и том же порядке все время. –

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