C# 在设置表中添加和更新值
我需要使用ADO在SQL Server的用户设置表中添加/更新一些值。这些值可能已经存在,如果已经存在,请更新该键的值;如果该键不存在,请为用户添加该值,该值在设置表中可能存在,也可能根本不存在 与DB表匹配的我的用户设置模型: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
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子句中进行筛选。如果你能提供完整的表格结构,我也许能帮你