Ali Alshihry Ответов: 2

Медленная обработка при работе с базой данных access


 -1
When reading and writing from the database, the device slows down exponentially and when the process repeats, it becomes much slower. Is there a way to speed up processing? I am writing a program by C # Windows Applications The code works properly and has no problems but the problem is only in the slow executable. As noted in the following code I take the student number from the first cell and then look in the database for the existence of a record of the student: If we find the student a record, the wizard will be directed to update student data If no student record is found, a new student record will be added to the student table This is a very slow code when it is re-executed:


Что я уже пробовал:

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, "تنبيه");
        }

2 Ответов

Рейтинг:
2

OriginalGriff

В дополнение к тому, что сказал ppolymoprphe - что действительно важно, и вам нужно что - то сделать с этим через все ваше приложение в срочном порядке-ваш SQL беден, и это не помогает производительности.
Почему это:

com1.CommandText = "SELECT  schoolname FROM  sch_school1 where schoolnumd='" + TBSchoolNum.Text + "'";
string schoolname = com1.CommandText;
con1.Open();
OleDbDataReader r1 = com1.ExecuteReader();
int y = 0;
while (r1.Read())
{ y += 1; }
con1.Close();
Когда вы можете сделать это, не возвращая никаких строк или не создавая DataReader?
com1.CommandText = "SELECT  COUNT(schoolname) FROM  sch_school1 where schoolnumd=@SN";
com1.Parameters.AddWithValue("@SN", TBSchoolNum.Text);
con1.Open();
int y = com1.ExecuteScalar():
con1.Close();
На самом деле вам даже не нужно этого делать: вы можете просто выполнить команду UPDATE и проверить возвращаемое значение (то есть количество затронутых строк) на ноль. Если ни одна строка не была обновлена, вам нужно сделать вставку.


Ali Alshihry

Спасибо вам от всего сердца за ваш совет и я сделаю то что вы сказали
На самом деле мне пришлось обновлять записи вместо того чтобы искать и затем редактировать и если я не изменял ни одной записи я бы добавил Хорошо

OriginalGriff

Всегда пожалуйста!
Просто убедитесь, что вы исправили SQL-инъекцию во всем своем приложении: оставьте одну конкатенацию, и вы все еще находитесь в опасности!

Рейтинг:
1

Patrice T

Цитата:
устройство замедляется экспоненциально, и когда процесс повторяется, он становится намного медленнее.

Можете ли вы определить "замедляется экспоненциально" и "намного медленнее" ?
com2.CommandText = "insert into sch_school1 (schoolnumd ,schoolname,Sys  ) values ('" + TBSchoolNum.Text + "','" + TBSchoolName.Text + "','" + TBschoolSys.Text + "')";
...
com2.CommandText = "update sch_school1  set  schoolname = '" + TBSchoolName.Text + "' where  schoolnumd ='" + TBSchoolNum.Text + "' ";

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]


Ali Alshihry

Примечание / Я изменил код, о котором идет речь, и поставил самый медленный код
Спасибо за совет
Я изменю ввод данных так, чтобы не было инъекции.
Я имею в виду медленно
Когда вы нажимаете кнопку в первый раз, выполнение неожиданно замедляется
Когда щелчок повторяется, выполнение становится медленнее
Когда он повторяется в третий раз, он становится полу-остановленным и запись 200 записей занимает около часа.

Patrice T

Чтобы понять, где и как тратится время, вам нужно рассчитать время вашего кода с помощью инструмента профилировщика.
Профилирование (компьютерное программирование) - Википедия[^]
Список инструментов анализа производительности - Википедия[^]