使用 OracleDataAccess.Fill(datatable) 更新 DataGridView 需要很长时间

Posted

技术标签:

【中文标题】使用 OracleDataAccess.Fill(datatable) 更新 DataGridView 需要很长时间【英文标题】:DataGridView takes a long time to update using OracleDataAccess.Fill(datatable) 【发布时间】:2021-12-25 13:34:08 【问题描述】:

我的应用程序中有一个 DataGridView 也有一个执行 oracle 函数并带来数据的函数。但是当这个返回很大时,每次刷新需要20到40秒来处理和填充表,直到数据量减少。这些表大约有 12 列,当处理超过 50~60 行时会出现问题。

oracle 中的查询很简单,不会出现这么慢的情况。 是否有任何替代方法或任何方法来优化此过程?当应用程序在第一个位置一次使用一个数据时,我会更新表。

获取函数:

        public DataTable GetWorkList(int ordenamiento)
        
            DataTable dtTemp = new DataTable();            

            OracleConnection oraConn = new 
            OracleConnection(this.mesParameters.DBConnectionString);
            OracleCommand oraComm = new OracleCommand();
            OracleDataAdapter oraDA = new OracleDataAdapter();
            OracleParameter oraParam;
            OracleParameter oraParamReturn;

            //Logger.Info("Procedure GETWORKLIST BEGIN");

            try
            
                oraComm.Connection = oraConn;
                oraComm.BindByName = true;
                oraComm.CommandType = CommandType.StoredProcedure;                                

                oraComm.CommandText = "PG_SL_IPR_WORKLIST_RF3";

                oraParam = new OracleParameter("PR_ORDER", OracleDbType.Int32, ordenamiento, ParameterDirection.Input);
                oraComm.Parameters.Add(oraParam);

                oraParamReturn = new OracleParameter("RETURN", OracleDbType.RefCursor, ParameterDirection.ReturnValue);
                oraComm.Parameters.Add(oraParamReturn);

                
                oraConn.Open();
                //Logger.Info("conexão aberta");
                //Logger.Info("oraDA Select BEGIN");
                oraDA.SelectCommand = oraComm;
                //Logger.Info("oraDA Select END");

                //Logger.Info("FILL BEGIN");
                oraDA.Fill(dtTemp);
                //Logger.Info("FILL END");
            
            catch (Exception ex)
            
                this.mesMessages.OKButtonMessage("GetWorkList\r\n" + ex.Message, "MES", System.Windows.Forms.MessageBoxIcon.Error);
            
            finally
            
                if(oraConn.State == ConnectionState.Open)
                
                    oraConn.Close();
                    //Logger.Info("conexão fechada");
                
            
            //Logger.Info("Procedure GETWORKLIST END");
            return dtTemp;
        

设置数据网格视图

public void SetDataGridView(Parameters prParameters, DataTable prTableInfo, String prTableConfigName)
        
            DataGridViewColumn dgvColumn;
            String[] strConfigColumnValues;

            try
            
                this.Columns.Clear();

                for (Int16 i = 0; i < prTableInfo.Columns.Count; i++)
                
                    // Get the config values for each column in order according the query
                    strConfigColumnValues = prParameters.GetParameter(prTableConfigName, prTableInfo.Columns[i].ColumnName.Trim().Replace(' ', '_').ToUpper()).Split('-');

                    dgvColumn = new DataGridViewTextBoxColumn();

                    dgvColumn.DataPropertyName = prTableInfo.Columns[i].ColumnName;
                    dgvColumn.Name = prTableInfo.Columns[i].ColumnName.Trim().Replace(' ', '_').ToUpper();
                    dgvColumn.HeaderText = strConfigColumnValues[0].Trim();
                    dgvColumn.Width = Convert.ToInt32(strConfigColumnValues[1].Trim());
                    dgvColumn.ReadOnly = Convert.ToBoolean(strConfigColumnValues[2].Trim());
                    dgvColumn.Visible = Convert.ToBoolean(strConfigColumnValues[3].Trim());

                    dgvColumn.Resizable = DataGridViewTriState.False;
                    dgvColumn.SortMode = DataGridViewColumnSortMode.NotSortable;

                    this.Columns.Add(dgvColumn);
                

                this.DataSource = prTableInfo;
            
            catch (Exception ex)
                            
                message.OKButtonMessage(ex.Message);
            
        

【问题讨论】:

分析您的代码以找出哪个部分是耗时的过程。也不清楚您调用此代码的频率。 @GustavoMorilla 抛出异常(即使它们会被忽略)可能会导致非常糟糕的延迟。但是您应该检查 VS 中的输出窗口,确保显示异常消息,或者只需从“调试”菜单/“异常设置”中选择所有 CLR 异常。只是为了确保不涉及异常。 对不起,我错过了您的回复……如果列没有改变,那么,在方法“外部”添加列并删除行……this.Columns.Clear(); 以及重新构建列的代码。您应该只需要更改网格数据源。更改数据源将自动删除现有行。 当你有超过 50 行时你是否在测试这个(当你说它很慢时)?读取文本文件是您能做的最慢的事情之一。 一开始就从文本文件中读取一次数据,并存储在列表或字典中(不知道你的文本文件长什么样子),然后在需要时参考信息。 【参考方案1】:

将大量数据加载到 datagridview 中的最佳技术是使用“分页”技术

【讨论】:

50-60行数据量不算大。

以上是关于使用 OracleDataAccess.Fill(datatable) 更新 DataGridView 需要很长时间的主要内容,如果未能解决你的问题,请参考以下文章

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份