【问题标题】:Loading certain number of rows from DataReader into datatable将一定数量的行从 DataReader 加载到数据表中
【发布时间】:2015-03-17 18:40:12
【问题描述】:

我有一个从 TSql 视图加载 DataGridView 的进程。我的用户之间一直在争论是返回所有行还是返回某个数字(我在后一个阵营:TOP 100)。我决定最好的方法是根据用户设置的字段动态返回行数。我原以为这是一项相当微不足道的任务。我期待加载一个带有 while 循环和读取函数的数据表,并在一定数量的行处停止。这可能吗?将代码保持在下面,但将数据表 (dt) 缩减到所需的行数,然后从那里加载 datagridview 是否有巨大的好处?

         public void Load_DGV(DataGridView dgv, string sqlx)
    {
        DateTime d1 = DateTime.Now;
        SqlCommand command = new SqlCommand(sqlx.ToString());

        SqlConnection connection = new SqlConnection(Properties.Settings.Default._CONNSTRING);
        command.Connection = connection;

        bool Success = true;
        DataTable dt = new DataTable();
        connection.Open();
        SqlDataReader reader = command.ExecuteReader();
       dt.Load(command.ExecuteReader());

        connection.Close();

        dgv.DataSource = null;
        dgv.DataSource = dt;
        Color_DGV(dgvProposal);

        dgvProposal.Sort(dgvProposal.Columns[m_Current_Menu_Item.OrderByCol], ListSortDirection.Descending);
        DateTime d2 = DateTime.Now;
        Console.WriteLine("Execution of " + sqlx + " took " + (d2 - d1).Seconds.ToString() + "s. ");
    }

【问题讨论】:

  • 这可能是解决这种情况的最佳方法。不幸的是,我的查询绝对庞大,需要经常更新,所以我把它放在一个不能有参数的视图中。另一种选择是存储过程,这是我的最坏情况。感谢您的想法!
  • 一个视图支持top x
  • 是的。但它不支持参数。我返回的行在运行时必须是动态的
  • 视图不支持参数? Where 子句怎么样? ADO.NET 本身支持参数化 SQL 字符串,而无需创建存储过程。 stackoverflow.com/questions/542510/…
  • 是的,但我不想在我的代码中硬编码 82 行 sql 查询,因为我需要更改它。到目前为止,我读到的所有内容都是视图并不容易原生地支持参数。您的建议是我认为我将为存储过程做的事情。 stackoverflow.com/questions/1687279/…

标签: c# tsql datagridview


【解决方案1】:

如果您进行更改,您将获得更好的性能,这样您就可以传递一个指示要返回的TOP 行数的参数。

否则,一旦将所有记录加载到新的DataTable 中,就可以使用 LINQ 到TAKE 前 xx 行,并将其分配给 DataSource

dataGridView1.DataSource = dt.Rows.Cast<DataRow>().Take(100).CopyToDataTable();

如果您使用 reader.Read() 遍历前 100 条记录并手动填写 DataTable,您可能会节省一些处理时间。至少那时你不会用数千条记录填充DataTable,只是为了丢弃它并创建另一个,更小的DataTable

【讨论】:

  • 这就是我的想法,但是您需要将 read() 记录转换为数据行的开销。我认为您的 TOP 建议是最好的选择。我得重构一些代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多