【问题标题】:program using up all memory from listview sql table, how to populate with only the relevant data?程序用尽了listview sql表中的所有内存,如何只填充相关数据?
【发布时间】:2013-09-11 22:58:32
【问题描述】:

我想我有一个使用我所有内存的列表视图。让我解释一下我在做什么

我有一个设备,我从中获取消息,我给它们加上时间戳,然后将它们添加到 sqldatabase 中

            myConnection.Open();
            SqlCommand cmd = new SqlCommand("INSERT INTO Messages (Time, Message) Values ('" + DateTime.Now + "', '"+sqlMessage+"')", myConnection);
            cmd.ExecuteNonQuery();
            myConnection.Close();
            UpdateTable();

这是我更新列表视图的方法:

            myConnection.Open();
            myCommand.Connection = myConnection;
            adapter.SelectCommand = myCommand;
            myCommand.CommandText = "SELECT * FROM Messages";

            DataSet ds = new DataSet();
            adapter.Fill(ds);


            lvwMessages.DataContext = ds.Tables[0].DefaultView;
            myConnection.Close();

当我让它运行一段时间后,我的程序通常会耗尽内存。我假设它是列表视图从数据库加载了太多消息。但是假设我在显示的屏幕上需要 15 行消息。我如何只加载我需要的 15 个,然后从内存中弹出不需要显示的那些,然后加载新的?

【问题讨论】:

    标签: c# listview


    【解决方案1】:

    将您的查询更改为仅选择最近的 15 个:

    myCommand.CommandText = "SELECT TOP 15 * FROM Messages ORDER BY Time Desc";
    

    TOP 15 表示仅选择返回的前 15 行,ORDER BY 确保它们按Time 排序(DESC 使它们从最高(最近)到最低排序,抚摸最近的开头)。

    (你没有提到什么 DBMS,所以我发布了一个在 SQL Server 中工作的数据库。你应该在以后的问题中包含适当的数据库引擎标签,因为 SQL 语法和功能可能因它们而异。)

    【讨论】:

    • listview 是否提供了某种内置方法,而不是在服务器上运行几行代码?我想如果我在开始滚动时必须点击数据库,这将不会表现得那么好
    • 这不是你在这里问的。 :-) 您的具体问题是“我如何只加载我需要的 15 个,然后将不需要显示的那些从内存中弹出,然后加载新的”,这就是我的回答。如果您有一个新的、不同的问题,您应该发布一个新问题并提出。您可以从那里链接这个以获得一些上下文。
    猜你喜欢
    • 1970-01-01
    • 2015-12-06
    • 2012-03-09
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    相关资源
    最近更新 更多