ConnectionString属性尚未初始化。刷新gridView时出现

时间:2013-10-03 13:22:21

标签: c# winforms datagridview

我正在尝试使用数据库中的数据填充dataGridView,它必须在表单加载时获取数据&当refreshButton点击时..

这是代码:

public partial class PhoneBookMainWindow : Form
{
    static public string connString = "Server=(local); Database=PhoneBook; Trusted_Connection=TRUE";
    public SqlConnection connection = new SqlConnection(connString);
    private void btnRefreshPhoneBook_Click(object sender, EventArgs e)
    {
        SqlCommand command = new SqlCommand("SELECT ID, contactName, jobTitle, currentAddress, workAddress, workPhone, cellPhone FROM ContactsInformations", connection);
        try
        {
            SqlDataAdapter dataAdapter = new SqlDataAdapter();
            dataAdapter.SelectCommand = command;
            DataTable dataSet = new DataTable();
            dataAdapter.Fill(dataSet);
            BindingSource bindingSrc = new BindingSource();

            bindingSrc.DataSource = dataSet;
            dataGridView1.DataSource = bindingSrc;
            dataAdapter.Update(dataSet);
        }
        catch (Exception x)
        {
            MessageBox.Show(x.Message);
            throw;
        }

    }
}

我在Form loading&中使用相同的代码btn clicking并且它们在执行中正常工作,但是当我从数据库中删除一行时出现问题(通过单击delete btn使用查询然后单击refresh btn展览来到我的面子。

1 个答案:

答案 0 :(得分:3)

您似乎面临的问题是您有多个代码块共享同一个SqlConnection对象。除了潜在的竞争条件,这意味着他们中的任何一个可能会在另一个人使用它之前尝试处理该对象。

一旦处置,对象就不再处于可以使用它的状态。特别是在这种情况下,它不再设置.ConnectionString

基本上,这种情况正在发生:

  • A类初始化连接
  • 方法A1使用连接
  • 方法A1完成连接并处理它
  • 方法A2尝试使用连接,但不能,因为它已被处理

创建SqlConnection对象不是一个特别耗费资源的过程,因此最好将其本地扩展到将要使用它的代码。像这样:

using (SqlConnection connection = new SqlConnection(connString))
{
    using (SqlCommand command = new SqlCommand("SELECT ID, contactName, jobTitle, currentAddress, workAddress, workPhone, cellPhone FROM ContactsInformations", connection))
    {
        try
        {
            SqlDataAdapter dataAdapter = new SqlDataAdapter();
            dataAdapter.SelectCommand = command;
            DataTable dataSet = new DataTable();
            dataAdapter.Fill(dataSet);
            BindingSource bindingSrc = new BindingSource();

            bindingSrc.DataSource = dataSet;
            dataGridView1.DataSource = bindingSrc;
            dataAdapter.Update(dataSet);
        }
        catch (Exception x)
        {
            MessageBox.Show(x.Message);
            throw;
        }
    }
}

我在这里做了两件事:

  1. SqlConnection对象是在方法内创建的,而不是在类级别创建的。这意味着除了这种方法之外什么都不会用。 (所以除了这种方法之外什么都不能打破它。)
  2. 我在using语句中包含了一些一次性对象,这是处理实现IDisposable的任何事情时的最佳做法。