在设置表中添加和更新值

时间:2018-04-13 14:37:15

标签: c# sql .net ado.net sql-server-2016

我需要使用ADO在SQL Server的用户设置表中添加/更新某些值。这些值可能已经存在,如果是这样,则更新密钥的值,如果密钥不存在,则为用户添加该密钥,在设置表中可能存在或可能不存在。

我的用户设置模型与数据库表匹配:

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();
    }
}

1 个答案:

答案 0 :(得分:2)

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

您只需将所有值插入临时表#TempSetting

即可

然后你可以做

<xsl:template match="text()">
  <xsl:value-of select="normalize-space(.)" />
</xsl:template>