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

Populating a datagrid using a OleDbCommand and maintaining the items source once connection is closed

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

代码:

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();

,代码将正常运行

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

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

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 上的数据适配器 class 的 link,它应该可以让您了解如何使用它。

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

如果你确实有很多数据,那么你应该考虑使用对象而不是数据 table(我认为无论如何都是例外)。我会做一些关于绑定和可观察集合的阅读,以使您的 WPF 适合这种情况,使用数据 reader 来填充对象(或 entity framework)。这里有一些相关的问题,这比我在上面发布大量代码要快。

WPF - Binding to collection in object

Bind collection of objects to ListBox

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