使用 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)