【发布时间】: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 行时你是否在测试这个(当你说它很慢时)?读取文本文件是您能做的最慢的事情之一。
-
一开始就从文本文件中读取一次数据,并存储在列表或字典中(不知道你的文本文件长什么样子),然后在需要时参考信息。
标签: c# winforms datagridview