C#Property get set没有设置值

时间:2015-04-16 07:51:02

标签: c# sql .net sql-server

我已经在Google和Stack Overflow上搜索了我遇到的这个问题。 很遗憾,我无法找到问题的正确答案。

首先,我将展示我的Classes和App.config。

分类:Form1:表单

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 始终为空。

我已在我的班级 Form1:表单上声明它需要在我的App.config中加载连接字符串。

不要忘记提及 ConfigurationManager.ConnectionStrings [&#34; MDFConnection&#34;]。ConnectionString; 本身会返回一个值,因此这里不是问题。

希望有人可以帮我解决这个问题。

编辑1

更改了代码,使人们更清楚。 ExecuteQuery也不重要,所以我在Database.cs类中创建了一个调用消息框的简单方法。

执行时,Executable和Exe.config也位于同一文件夹中。

3 个答案:

答案 0 :(得分:3)

我没有确切的答案,但在同样的情况下我会问自己几个问题。

  1. 连接字符串是否实际获得?即将解决方案分解一点以便调试在myConn上添加断点,如下所示。

    private void Form1_Load(object sender,EventArgs e) {

    var myConn = ConfigurationManager.ConnectionStrings [&#34; MDFConnection&#34;]。ConnectionString; db.MdfConnectionString = myConn;

    }

  2. 您设计的当前解决方案允许在没有连接字符串的情况下使用datatbase类。将连接放入构造函数以消除潜在的错误会更好吗? E.g。

    公共类数据库 {

    private string _mdfConnectionString;

    公共数据库(字符串连接)

    {

    _mdfConnectionString = conn;

    }

    ...

    }

  3. 然后,您可能希望在表单加载上构建它。

    1. 对于网络内容,有时您不会使用您认为正在使用的实例。如果所有其他方法都失败了,您可以尝试将类更改为单例,但依赖注入样式应该更好。
    2. 编辑 - 在编辑之后,我相信您现在在表单加载之前调用Test。请尝试第2点(将连接字符串注入构造函数),然后您知道没有连接字符串就没有该类的实例。我已经在一个控制台中尝试了你的课,它很好,所以问题很可能是加载顺序。 DI会解决这个问题。

答案 1 :(得分:0)

该方法何时被调用? Yust在构造函数中查找它喜欢的代码,在构造函数中初始化字符串:

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

答案 2 :(得分:0)

Form1:表单

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

似乎我在加载表单之前加载了我的方法。