使用 OleDbCommand 填充数据网格,并在连接关闭后维护项源



我有下面的代码来填充C# WPF应用程序中的数据网格。有人告诉我,一旦我检索到我需要的数据,我就应该"关闭"连接。但是,一旦连接关闭,读取器也会丢失数据网格的项源。关闭连接和读取器后,我将如何维护此数据网格的内容?澄清一下,检索数据后,数据网格内容不会更改。

法典:

OleDbConnection conn = new OleDbConnection { ConnectionString = DataBase.ConnectionString() };
conn.Open();
OleDbDataReader reader = null;
OleDbCommand command = new OleDbCommand("SELECT [ID],[ClassName] FROM Class WHERE TeacherID = @TeacherID", conn);
command.Parameters.AddWithValue("@TeacherID", Properties.Settings.Default.UserID);
reader = command.ExecuteReader();
_ClassGrid.ItemsSource = reader;    //_ClassGrid is my DataGrid
conn.Close();   

如果我删除conn.close();,代码将正常工作

提前感谢您的任何帮助,非常感谢。

因此,在显示数据时,需要将项源"绑定"或设置为断开连接的对象,而不是直接设置数据源。 还应确保在代码中处理所有一次性对象。 如果您没有大量数据,最简单的方法是使用填充数据表。 如果您确实有很多数据,那么您应该在集合中使用 POCO。 以下代码显示了数据表:

DataTable stuffToDisplay = new DataTable();
using (var conn = new OleDbConnection { ConnectionString = DataBase.ConnectionString() })
{
conn.Open();
using(var command = new OleDbCommand("SELECT [ID],[ClassName] FROM Class WHERE TeacherID = @TeacherID", conn))
{
command.Parameters.AddWithValue("@TeacherID", Properties.Settings.Default.UserID);
using(var adapter = new OleDbDataAdapter(command))
{
adapter.Fill(stuffToDisplay);
}
}
}
// Looks like you need to set to default view in WPF
_ClassGrid.ItemsSource = stuffToDisplay.DefaultView;

这是一种粗略的切割,所以请用一粒调试盐来对待它。 但是试一试这样的事情。 这是指向MSDN上数据适配器类的链接,它应该让您了解如何使用它。

https://msdn.microsoft.com/en-us/library/system.data.oledb.oledbdataadapter(v=vs.110(.aspx

如果你确实有很多数据,那么你应该考虑使用对象而不是数据表(我认为无论如何这更例外(。 我会对绑定和可观察集合进行一些阅读,以使 WPF 适合这种情况,使用数据读取器填充对象(或实体框架(。 这里有一些相关的问题,这比我在上面发布大量代码要快。

WPF - 绑定到对象中的集合

将对象的集合绑定到列表框

https://social.msdn.microsoft.com/Forums/vstudio/en-US/1f211699-5764-47ae-9ad9-d9ff2875e9c0/how-to-set-listboxitemssource-to-a-collection-of-objects-in-xaml?forum=wpf

https://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.itemssource%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

最新更新