我需要使用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();
}
}
答案 0 :(得分:2)
你可以使用MERGE语句,但这对于像这样的简单事情来说是一种过度杀伤力。
您只需将所有值插入临时表#TempSetting
即可然后你可以做
<xsl:template match="text()">
<xsl:value-of select="normalize-space(.)" />
</xsl:template>