c# ADO.. NET异常:ExecuteReader:连接属性未初始化

本文关键字:属性 初始化 连接 ExecuteReader NET 异常 ADO | 更新日期: 2023-09-27 18:03:34

嗨,我想从一个简单的数据库中得到一些数据,我在主表单上使用了一个单独的控件。这个程序运行,然而,当我试图查看设计器视图的主要形式,我得到这个异常"ExecuteReader:连接属性尚未初始化。"

这是我的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(),但不在表单加载中,这一切似乎都可以正常工作。项目仍然运行没有错误,我只是得到的异常,当试图查看设计器视图在主要形式。

c# ADO.. NET异常:ExecuteReader:连接属性未初始化

这是因为Visual Studio在设计器中创建了窗体的实例,所以任何_Load类型的事件和默认构造函数都将被执行。

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

的例子:

void MyMainForm()
{
  InitializeComponent();
  //Do any UI Init Stuff (Icons etc.) here.
  if (!DesignMode)
  {
    //Business Logic (call databases etc.) here.
  }
}