Оптимизация вставки данных в код базы данных доступа - PullRequest
1 голос
/ 07 апреля 2020

Я пытаюсь вставить данные из таблицы sql для доступа к базе данных, используя C#. Вставка в базу данных доступа занимает слишком много времени. Работает почти 1 час. Может ли кто-нибудь предложить какой-либо способ оптимизации кода:

Ниже мой код для вставки данных в базу данных Access

 using (OleDbConnection connection = new OleDbConnection(_configuration.GetConnectionString("AccessConnection")))
            {
                using (OleDbCommand cmd = new OleDbCommand("INSERT INTO RecsCD(RecordingDate, Gr,Grant,DocType,  DocNumber,UserDocNumber,NumOfPages) values (?, ?, ?, ?, ?, ?, ?)", connection))
                {
                    connection.Open();

                    foreach (var records in recList)
                    {

                        cmd.Parameters.Add("@RecordingDate", OleDbType.VarChar).Value = records.RecordingDate == null ? "" : records.RecordingDate;
                        cmd.Parameters.Add("GR", OleDbType.VarChar).Value = records.Grantor == null ? "": records.Gr;
                        cmd.Parameters.Add("Grant", OleDbType.VarChar).Value = records.Grantee == null? "": records.Grant;
                        cmd.Parameters.Add("DocType", OleDbType.VarChar).Value = records.DocType == null ? "" : records.DocType; ;
                        cmd.Parameters.Add("DocNumber", OleDbType.VarChar).Value = records.DocNumber == null ? "" : records.DocNumber; ;
                        cmd.Parameters.Add("UserDocNumber", OleDbType.VarChar).Value = records.InternalDocNumber == null ? "" : records.InternalDocNumber; ;
                        cmd.Parameters.Add("NumOfPages", OleDbType.VarChar).Value = records.NumberPages == null ? "" : records.NumberPages; ;
                        cmd.ExecuteNonQuery();
                    }
                }

Запрос, который я использую для вставки данных, является просто запросом выбора :

изменить процедуру RecLoad_GetPrimeparsedData

AS

 SELECT 
       [RecLoadId]
      ,[DocNumber]
      ,[InternalDocNumber]
      ,[RecordingDate]
      ,[DocType]
      ,[DocDescription]
      ,[Gr]
      ,[Grant]
      ,[NumberPages]
      ,[SourceCode]
      ,[Parcel_No]
  FROM [db_recload].[dbo].[RecLoadSplit]

Я получаю данные в C# с использованием хранимой процедуры:

publi c Список getPrimeData () {

    return _context.RecLoad
         .FromSql("EXECUTE RecLoad_GetPrimeparsedData").ToList();

}

всего в таблице 6843 строки

любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 07 апреля 2020

Похоже, вы добавляете в коллекцию Parameters без очистки.

Попробуйте cmd.Parameters.Clear(); перед вызовом Parameters.Add ()

Все перегрузки в исходном коде для метода Add метода ParameterCollection показывает, что новый параметр добавляется в конец списка. Я точно не знаю, какие издержки возникают при наличии тысяч параметров с одинаковым именем, но я точно знаю, что вам следует очистить параметры перед заполнением их для нового запроса.

                foreach (var records in recList)
                {
                    cmd.Parameters.Clear();
                    cmd.Parameters.Add("@RecordingDate", OleDbType.VarChar).Value = records.RecordingDate == null ? "" : records.RecordingDate;
                    cmd.Parameters.Add("GR", OleDbType.VarChar).Value = records.Grantor == null ? "": records.Gr;
                    cmd.Parameters.Add("Grant", OleDbType.VarChar).Value = records.Grantee == null? "": records.Grant;
                    cmd.Parameters.Add("DocType", OleDbType.VarChar).Value = records.DocType == null ? "" : records.DocType; ;
                    cmd.Parameters.Add("DocNumber", OleDbType.VarChar).Value = records.DocNumber == null ? "" : records.DocNumber; ;
                    cmd.Parameters.Add("UserDocNumber", OleDbType.VarChar).Value = records.InternalDocNumber == null ? "" : records.InternalDocNumber; ;
                    cmd.Parameters.Add("NumOfPages", OleDbType.VarChar).Value = records.NumberPages == null ? "" : records.NumberPages; ;
                    cmd.ExecuteNonQuery();
                }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...