【发布时间】:2018-04-13 14:37:15
【问题描述】:
我需要使用 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();
}
}
【问题讨论】:
-
您正在描述 MERGE 操作,请查看此链接。 docs.microsoft.com/en-us/sql/t-sql/statements/…
标签: c# sql .net ado.net sql-server-2016