C# 在设置表中添加和更新值

C# 在设置表中添加和更新值,c#,sql,.net,ado.net,sql-server-2016,C#,Sql,.net,Ado.net,Sql Server 2016,我需要使用ADO在SQL Server的用户设置表中添加/更新一些值。这些值可能已经存在,如果已经存在,请更新该键的值;如果该键不存在,请为用户添加该值,该值在设置表中可能存在,也可能根本不存在 与DB表匹配的我的用户设置模型: public class UserSettingsModel { public string UserId { get; set; } public string Key { get; set; } public string Value { g

我需要使用ADO在SQL Server的用户设置表中添加/更新一些值。这些值可能已经存在,如果已经存在,请更新该键的值;如果该键不存在,请为用户添加该值,该值在设置表中可能存在,也可能根本不存在

与DB表匹配的我的用户设置模型:

public class UserSettingsModel
{
    public string UserId { get; set; }
    public string Key { get; set; }
    public string Value { get; set; }
}
如何获取现有设置:

public static List<UserSettingsModel> GetUserSettings(string userId)
{
    List<UserSettingsModel> settings = new List<UserSettingsModel>();

    using (SqlConnection c = ConnectVRS())
    {
        SqlCommand cmd = new SqlCommand(@"
                SELECT    SettingKey
                        , SettingValue
                FROM    UserSettings
                WHERE   UserId = @UserId
            ", c);

        cmd.Parameters.Add("@UserId", SqlDbType.VarChar).Value = userId;

        using (SqlDataReader dr = cmd.ExecuteReader())
        {
            while (dr.Read())
            {
                settings.Add(new UserSettingsModel()
                {
                    UserId = userId,
                    Key = dr[0].ToString(),
                    Value = dr[1].ToString()
                });
            }
        }
    }

    return settings;
}
现在,我需要添加和更新设置的方法。我可以对传入的值进行循环,并对每个项执行查询,但我似乎想起了更好的方法?是否能够将所有传入值堆叠到单个查询中?是否在查询中检查并添加/更新?谢谢你的帮助

AddUpdate的其他代码:

public static void AddUpdateUserSettings(List<UserSettingsModel> userSettings)
{
    DataService.LogAudit("", "Add/Update User Settings");

    using (SqlConnection c = ConnectVRS())
    {
        SqlCommand cmd = new SqlCommand(@"
            CREATE TABLE #TempSettings ( UserId VarChar(128), SettingKey VarChar(100), SettingValue Text );

            INSERT INTO #TempSettings ( UserId, SettingKey, SettingValue ) VALUES ('Connie', 'two', 'four')

            INSERT INTO UserSettings
            SELECT UserId, SettingKey, SettingValue FROM #TempSettings 
            WHERE SettingKey NOT IN(
                SELECT UserSettings.SettingKey FROM UserSettings
                    INNER JOIN #TempSettings ON UserSettings.UserId = #TempSettings.UserId)

            UPDATE s
                SET s.SettingValue = t.SettingValue
            FROM UserSettings s
                INNER JOIN #TempSettings t ON s.UserId = t.UserId AND s.SettingKey = t.SettingKey

            DROP TABLE #TempSettings
        ", c);

        cmd.ExecuteNonQuery();
    }
}

您可以使用MERGE语句,但对于像这样简单的事情来说,这是一种过度使用

只需将所有值插入临时表TempSetting即可

那你就可以了

INSERT INTO UserSettings
SELECT .... FROM #TempSettings 
WHERE SettingKey NOT IN(
SELECT UserSettings.SettingKey FROM UserSettings
INNER JOIN #TempSettings ON 
UserSettings.SettingKey = #TempSettings.SettingKey)


UPDATE UserSettings
SET UserSettings.SettingValue= #TempSettings.SettingValue FROM UserSettings
INNER JOIN #TempSettings ON 
UserSettings.SettingKey = #TempSettings.SettingKey

您可以使用MERGE语句,但对于像这样简单的事情来说,这是一种过度使用

只需将所有值插入临时表TempSetting即可

那你就可以了

INSERT INTO UserSettings
SELECT .... FROM #TempSettings 
WHERE SettingKey NOT IN(
SELECT UserSettings.SettingKey FROM UserSettings
INNER JOIN #TempSettings ON 
UserSettings.SettingKey = #TempSettings.SettingKey)


UPDATE UserSettings
SET UserSettings.SettingValue= #TempSettings.SettingValue FROM UserSettings
INNER JOIN #TempSettings ON 
UserSettings.SettingKey = #TempSettings.SettingKey

如果您正在描述合并操作,请查看此链接。如果您正在描述合并操作,请查看此链接。我不得不向下移动内部连接,因为它会出错,但在SSMS中测试时,查询效果很好。谢谢现在,我想知道如何填充临时表。上面添加了临时代码。@ConnieDeCinkoCS您可以执行n次插入,也可以只执行Valuesid、key、val、id2、key2、val2、i3、key3、val3。基本上,将所有设置插入临时表,然后将其合并。由于临时表仅在当前会话/事务中可见,因此您不必担心争用条件问题,也不必在最后将其删除Sql server为您解决了一个问题,因为UserId和SettingKey是一个复合主键。我想我可能需要在表中添加一个标识列,这样我就可以将它传递到我的NOT IN中。@ConnieDeCinkoCS只需在ON子句中进行筛选。如果您可以提供完整的表结构,我可能可以帮助您,因为我必须向下移动内部联接,因为它会出错,但在SSMS中测试时查询效果非常好。谢谢现在,我想知道如何填充临时表。上面添加了临时代码。@ConnieDeCinkoCS您可以执行n次插入,也可以只执行Valuesid、key、val、id2、key2、val2、i3、key3、val3。基本上,将所有设置插入临时表,然后将其合并。由于临时表仅在当前会话/事务中可见,因此您不必担心争用条件问题,也不必在最后将其删除Sql server为您解决了一个问题,因为UserId和SettingKey是一个复合主键。我想我可能需要在表中添加一个标识列,这样我就可以将它传递到我的NOT IN中。@ConnieDeCinkoCS只需在ON子句中进行筛选。如果你能提供完整的表格结构,我也许能帮你