我正在尝试使用数据库中的数据填充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
展览来到我的面子。
答案 0 :(得分:3)
您似乎面临的问题是您有多个代码块共享同一个SqlConnection
对象。除了潜在的竞争条件,这意味着他们中的任何一个可能会在另一个人使用它之前尝试处理该对象。
一旦处置,对象就不再处于可以使用它的状态。特别是在这种情况下,它不再设置.ConnectionString
。
基本上,这种情况正在发生:
创建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;
}
}
}
我在这里做了两件事:
SqlConnection
对象是在方法内创建的,而不是在类级别创建的。这意味着除了这种方法之外什么都不会用。 (所以除了这种方法之外什么都不能打破它。)using
语句中包含了一些一次性对象,这是处理实现IDisposable
的任何事情时的最佳做法。