Производительность и эффективная функция - PullRequest
0 голосов
/ 30 июня 2018

У меня есть функция в C #, которая имеет параметр списка типа объекта. Теперь функция имеет цикл for, который выполняет итерацию по номеру элемента в списке. А внутри цикла происходит обновление SQL-запроса и обновление поля таблицы элементами list [i].

Проблема в том, что цикл может выполняться 2000 раз. Итак, как я могу написать функцию для улучшения кода C #.

Вот мой пример кода. Так что же нужно делать?

public int UpdateTableAccount(List<Account> ac)
{
    int j = 0;
    for (int i = 0; i < ac.Count; i++)
    {
        if (ac[i].isActive)
        {
            var str = $"UPDATE account SET amount = '{ac[i].amount}' WHERE (AccountId = '{ac[i].AccountId}'";
            j += Convert.ToInt16(dba.ExecuteSQL(str));
        }
    }
    return j;
}

1 Ответ

0 голосов
/ 01 июля 2018

Прежде всего, не рекомендуется вызывать обновление базы данных внутри цикла. Этого следует избегать. Это не только создает проблемы с производительностью, но и другие проблемы.

Если база данных MS-SQL server и приложение разрешает Stored Procedure, тогда мы можем использовать Табличные параметры для решения этой проблемы.

  1. Создать Определенный пользователем тип таблицы

    CREATE TYPE dbo.AccountTableType AS TABLE
    (AccountId int, Amount decimal(18, 2))
    
  2. Создайте Stored Procedure с этим User Defined Table Type

    CREATE PROCEDURE usp_UpdateAccount
    (@tvpAccount dbo.AccountTableType READONLY)
    
  3. Реализация запроса UPDATE с JOIN в Stored Procedure

    UPDATE Account
    SET Account.Amount = ATT.Amount  
    FROM dbo.Account 
    INNER JOIN @tvpAccount AS ATT  
    ON dbo.Account.AccountId = ATT.AccountId; 
    
  4. Создайте DataTable и передайте необходимые значения в пользовательском типе

    // Sample code
    DataTable dataTable = new DataTable();
    dataTable.Columns.Add("AccountId"); //create column with correct data type
    dataTable.Columns.Add("Amount"); //create column with correct data type
    // Add rows to the table
    ...
    
    // Assuming the connection and command is available.
    SqlParameter tvpParam = sqlCommand.Parameters.AddWithValue("@tvpAccount", dataTable);  
    tvpParam.SqlDbType    = SqlDbType.Structured;  
    tvpParam.TypeName     = "dbo.AccountTableType";  
    
    sqlCommand.ExecuteNonQuery();
    

Эти шаги объяснены в этой статье Microsoft .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...