C# 性能和有效功能

C# 性能和有效功能,c#,loops,C#,Loops,我在C#中有一个函数,它的参数是对象类型的List。现在,该函数具有for循环,该循环迭代列表中的元素数。在一个循环中有更新sql查询,并使用list[i]元素更新表的字段 问题是循环可能会运行2000次。那么,如何编写一个函数来改进c代码呢 这是我的示例代码。那么你需要做什么呢 public int UpdateTableAccount(List<Account> ac) { int j = 0; for (int i = 0; i < ac.Count; i

我在C#中有一个函数,它的参数是对象类型的List。现在,该函数具有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;
}
public int UpdateTableAccount(列表ac)
{
int j=0;
对于(int i=0;i
首先,在循环内调用数据库更新是不可取的。这应该避免。它不仅会产生性能问题,还会产生其他问题

如果数据库是
MS-SQL server
,并且应用程序允许
存储过程
,那么我们可以使用表值参数来解决此问题

  • 创造

  • 使用此
    用户定义的表类型创建一个
    存储过程

    CREATE PROCEDURE usp_UpdateAccount
    (@tvpAccount dbo.AccountTableType READONLY)
    
  • 使用
    存储过程中的
    JOIN
    执行
    UPDATE
    查询

    UPDATE Account
    SET Account.Amount = ATT.Amount  
    FROM dbo.Account 
    INNER JOIN @tvpAccount AS ATT  
    ON dbo.Account.AccountId = ATT.AccountId; 
    
  • 创建
    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教程中进行了解释。

    您必须查看大容量插入。如果您要从数据库获取一个表,请使用适配器将结果放入c#datatable。然后在更新datatable中的值后,您可以使用Accept Change方法将修改放回数据库。这是不可能回答的,因为还没有告诉我们瓶颈是什么。如果瓶颈是“执行多达2000个sql”,那么答案很简单,不要。请修复sql执行方法,使其不会最终每个项执行1个sql。但是,这很可能不像简单地将sql重写为“WHERE IN(…)”那么简单列表中的2000个项目可能会导致其他问题。但在我们帮助您之前,这里的瓶颈究竟是什么?我们可以使用表值参数作为SP的参数,并在存储过程中更新表。我只想知道是否有任何方法可以使此代码有效,因为循环可能会达到2000,我猜这是reason我的应用程序在数据库中来回运行时会出现性能问题。
    // 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();