C# 处理Access数据库时处理速度慢
从数据库读取和写入数据时,设备的速度会呈指数级下降,而当过程重复时,速度会慢得多。有没有办法加快处理速度? 我正在用C#Windows应用程序编写一个程序 代码工作正常,没有问题,但问题只存在于速度较慢的可执行文件中。 如以下代码所述,我从第一个单元格中提取学生编号,然后在数据库中查找是否存在该学生的记录: 如果我们找到学生a记录,向导将被引导更新学生数据 如果未找到学生记录,则会将新的学生记录添加到学生表中 重新执行时,这是一段非常慢的代码:C# 处理Access数据库时处理速度慢,c#,ms-access,oledb,C#,Ms Access,Oledb,从数据库读取和写入数据时,设备的速度会呈指数级下降,而当过程重复时,速度会慢得多。有没有办法加快处理速度? 我正在用C#Windows应用程序编写一个程序 代码工作正常,没有问题,但问题只存在于速度较慢的可执行文件中。 如以下代码所述,我从第一个单元格中提取学生编号,然后在数据库中查找是否存在该学生的记录: 如果我们找到学生a记录,向导将被引导更新学生数据 如果未找到学生记录,则会将新的学生记录添加到学生表中 重新执行时,这是一段非常慢的代码: prog1.Value = 0; prog2.Va
prog1.Value = 0;
prog2.Value = 0;
prog1.Maximum = DGV1.RowCount;
string muoadNotSave = "";
prog2.Maximum = 7;
for (int i = 0; i < DGV1.RowCount; i += 5)
{
FlushMemory();//دالة تفريغ الذاكرة
if (prog1.Value < DGV1.RowCount - 2)
{
prog1.Value += 5;
}
else
{
prog1.Value += 1;
}
try
{
if (DGV1.Rows[i].Cells[16].Value != null)
{ string name = DGV1.Rows[i].Cells[15].Value.ToString();
int cell_no = DGV1.ColumnCount - 4;//عدد خلايا الصف
for (int o = 0; o <= 6; o++)
{
prog2.Value += 1;
int shoabah_No = 0;
int studenID =
int.Parse(DGV1.Rows[i].Cells[16].Value.ToString());
string ShoabahName =
DGV1.Rows[i].Cells[cell_no].Value.ToString();
OleDbConnection con77 = new
OleDbConnection(System.Configuration
.ConfigurationManager.ConnectionStrings["acce"].ToString());
OleDbCommand com77 = new OleDbCommand();
com77.Connection = con77;
com77.CommandText = "SELECT * FROM Table_Shoab
where shoba_name ='" + ShoabahName + "'";
con77.Open();
OleDbDataReader r77 = com77.ExecuteReader();
while (r77.Read())
{
shoabah_No =
int.Parse(r77["shoba_id"].ToString());
}
con77.Close();
if (shoabah_No != 0)
{
OleDbConnection con6 = new
OleDbConnection(System.Configuration
.ConfigurationManager.ConnectionStrings["acce"].ToString());
OleDbCommand com6 = new OleDbCommand();
com6.Connection = con6;
com6.CommandText = "insert into
link_stud_shobah (shoba_id,JLOS_NO) values
('" + shoabah_No + "','" + studenID + "')";
con6.Open();
com6.ExecuteNonQuery();
if (con6.State == ConnectionState.Open)
con6.Close();
}
else
{
muoadNotSave +=
DGV1.Rows[i].Cells[cell_no].Value.ToString()
+ " " + studenID + "\n\r";
}
cell_no += -2;
}
prog2.Value = 0;
}
}
catch (Exception ex)
{
//MessageBox.Show(ex.ToString());
MessageBox.Show("اما ان يكون هناك مشكلة في الاتصال او ان الطالب "
+ " " + DGV1.Rows[i].Cells[23].Value + " " + " سبق تسجيلة ",
"تنبيه");
// MessageBox.Show("" + ex, "تنبيه");
}
finally
{
}
}
if (muoadNotSave != "")
{
MessageBox.Show("الشعب التي لم تحفظ "+muoadNotSave,
"تنبيه");
}
else
{
MessageBox.Show("تم حفظ كافة الشعب بنجاح ولله الحمد " +
muoadNotSave, "تنبيه");
}
prog1.Value=0;
prog2.值=0;
prog1.max=DGV1.RowCount;
字符串muoadNotSave=“”;
程序2.最大值=7;
对于(int i=0;i 对于(int o=0;o,您正在(嵌套)循环中创建、打开和关闭OleDbConnection
,这非常昂贵
尝试在外部循环之外执行以下操作:
OleDbConnection con77 = new OleDbConnection ..
OleDbCommand com77 = new OleDbCommand();
com77.Connection = con77;
con77.Open();
..
con77.Close();
OleDbConnection con6 = new OleDbConnection ..
OleDbCommand com6 = new OleDbCommand();
com6.Connection = con6;
con6.Open();
..
con6.Close();
此外,如果两个连接相同,则只需创建一个
不确定是什么FlushMemory()
可以,但这也可能很昂贵,最好在主循环之后调用此函数,或者根本不调用此函数。一般来说,最好将密集/缓慢的任务(如IO、数据库、消费服务)保持在单独的线程上,以便UI保持响应。请显示一些代码。我必须从内环调用base,因为我有从数据中查看数据梯度,我获取每一行的数据,然后在数据库中搜索,然后更新或添加到此记录,因此您应该联系获取记录数据(行)的时间。对于内存功能,请清除缓存memory@AliAlshihry是的,但是您可以在循环内执行该命令(重用相同的开放连接)在循环之前创建/打开连接(并在主循环之后关闭)。您甚至可以为整个程序创建一个连接对象,并在需要访问数据库的任何地方重用该对象。Danny先生衷心感谢您,我将应用您宝贵的提示和建议。因此,我将返回给您。