C#ADO.NET异常:ExecuteReader:Connection属性尚未初始化

时间:2011-07-27 12:12:26

标签: c# ado.net sqlconnection

您好我正在尝试从我在主窗体上使用单独控件创建的简单数据库中获取一些数据。这个程序运行但是当我尝试在设计器视图中查看主窗体时,我得到了这个异常“ExecuteReader:Connection属性尚未初始化。”

这是我的GetControl代码:

namespace Controls
{
    public partial class GetControl : UserControl
    {
        private SqlCeConnection mConnection = null;
        private SqlCeDataReader dataReader = null;

        public SqlCeConnection Connection
        {
            set { mConnection = value; }
        }

        public GetControl()
        {
            InitializeComponent();
        }

        private void GetControl_Load(object sender, EventArgs e)
        {
            getData();
            addData();
        }

        private void getData()
        {
            SqlCeCommand command = new SqlCeCommand("SELECT FirstName, LastName FROM Contacts", mConnection);
            dataReader = command.ExecuteReader();
        }

        private void addData()
        {
            while (dataReader.Read())
            {
                contactList.Items.Add(dataReader.GetString(0) + " "
                    + dataReader.GetString(1));

            }
        }
    }
}

我的主要形式:

namespace Phonebook_Application
{
    public partial class Phonebook_MainForm : Form
    {
        SqlCeConnection con = new SqlCeConnection("Data Source=Phonebook.sdf;Persist Security Info=false;");

        public Phonebook_MainForm()
        {
            InitializeComponent();
            con.Open();
            getControl1.Connection = con;
        }
    }
}

如果我在按钮处理程序中调用getData()和addData()而不是在表单加载中,这一切似乎都可以正常工作。该项目仍然运行没有错误我只是在尝试以主窗体查看设计器视图时获得该异常。

1 个答案:

答案 0 :(得分:1)

这是因为Visual Studio在Designer中创建了表单实例,因此将执行任何_Load类型事件和默认构造函数。

您可以通过检查DesignMode属性来检查您是否处于设计时间,尽管有limitations但您的案例DesignMode应该足够了。

示例:

void MyMainForm()
{
  InitializeComponent();

  //Do any UI Init Stuff (Icons etc.) here.

  if (!DesignMode)
  {
    //Business Logic (call databases etc.) here.
  }
}