c# - 需要单次点击数据库

标签 c# sql-server

我正在数据库中一个一个地保存用户偏好列表,我想一次保存。

这段代码工作正常,但我正在寻找优化的方法。

满足相同需求的最佳优化方式是什么。

public void SavePreference(List<UserPreferences> userPreference, string tokenId, string clientIp, string endUserIp)
    {
        var tokenPersister = new TokenPersister();
        var loginMemberId = tokenPersister.GetMemberId(tokenId, clientIp, endUserIp);

        if (loginMemberId <= 0)
        {
            Audit.Add(AuditEventType.SaveUserPreference, Severity.High, loginMemberId, tokenId,
                     "SaveUserPreference Failed|InValid Session", clientIp, endUserIp);
            throw new BusinessServiceException(ErrorType.InValidSession, "User Session has been Expired, please login again");
        }
        foreach (var userPreferences in userPreference)
        {
            var flag = -1;
            var paramPreference = new DbParameter[6];
            paramPreference[0] = DataAccess.ParameterFactory.Create("@memberId", DbType.Int32, userPreferences.MemberId);
            paramPreference[1] = DataAccess.ParameterFactory.Create("@preferenceKey", DbType.String, userPreferences.Key);
            paramPreference[2] = DataAccess.ParameterFactory.Create("@value", DbType.String, userPreferences.PreferenceValue);
            paramPreference[3] = DataAccess.ParameterFactory.Create("@category", DbType.String, userPreferences.Category);
            paramPreference[4] = DataAccess.ParameterFactory.Create("@itemTypeId", DbType.Int32, (int)userPreferences.ItemTypeId);
            paramPreference[5] = DataAccess.ParameterFactory.Create("@flag", DbType.Int32, flag);
            paramPreference[5].Direction = ParameterDirection.Output;

            try
            {
                DataAccess.ExecuteNonQuery(SpNames.SavePreference, paramPreference);
                flag = (int)paramPreference[5].Value;
                Audit.Add(AuditEventType.SaveUserPreference, Severity.Low, loginMemberId, tokenId, "SaveUserPreferences: SavePreference Successfully",
                    clientIp, endUserIp);
                if (flag == -1)
                {
                    throw new BusinessServiceException(ErrorType.InvalidRequest, "Site name " + userPreferences.PreferenceValue + " already exists");
                }

            }

            catch (Exception ex)
            {

            }
        }

    }

最佳答案

使用表值参数 (TVP) 将整个列表作为单个参数一次发送。使用 INSERT ... SELECT 语法插入所有这些。您会在 Web 上找到这方面的示例。这是一种常见的技术。

使用存储过程在这里不会获得任何性能。不过,请确保使用参数化 SQL。

关于c# - 需要单次点击数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21285394/

相关文章:

c# - C# MTA 线程创建 STA COM 对象的危险

c# - AssemblyTitle 一旦设置就永远不会改变,我希望它根据配置进行更改

sql - SQL中的级联菱形删除

sql-server - 什么是 sql-server 中的 ISO_year

sql - SQL Server 中事务的正确使用

sql - 为什么 SQL Server dateadd datediff 在使用周时会出现这种行为

sql - 有效地随机化(洗牌)Sql Server 表中的数据

c# - 创建自定义配置

c# - 如何从外部 try/catch 传递值到 catch block (不使用全局变量)

javascript - 从 C# 背后的代码调用 JS 函数