将身份列重置为 0
Reset identity Column to 0
首先是我的数据库结构和我的程序。
我有一个包含 3 tables 的简单数据库。
- 服务器
- 资源
- Avg_ressources
资源和 Avg_Ressources 包含来自服务器的外键。两者还包含一个主键。
我的程序每秒将 cpu 使用情况、内存使用情况和时间写入资源 table。写作部分在一个线程中(这背后的原因是我从多个服务器通过网络通过流获取信息)
在另一个线程中,我 运行 一个 class 具有将资源 table 中的数据分组并将它们插入 Avg_Usage table 的方法。到目前为止,一切都按预期工作。
下面是错误的部分。
将数据插入 table 后,我尝试使用
从旧的 table 中删除数据
db.ExecuteCommand("TRUNCATE TABLE Ressources")
db 在这种情况下是我的 DataContext。来自 Ressources 的数据被删除,但主键仍然包含相同的值。在下一次插入时,程序会触发以下错误 + stacktrace
System.Data.Linq.DuplicateKeyException
System.Data.Linq.ChangeProcessor.PostProcessUpdates(List`1 insertedItems, List`1 deletedItems) at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)
at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
at System.Data.Linq.DataContext.SubmitChanges()
我已经试过了db.ExecuteCommand("DBCC CHECKIDENT (Ressources, RESEED, 0)");
但也没有成功。
请注意,在将数据插入 Ressources 之前,我还尝试使用 db.Refresh,但这并没有解决问题。当我通过 sql 服务器管理器直接在数据库上使用命令时,它工作正常。
现在我的问题是:
我是否必须停止我的其他线程才能实际重置密钥?
所以我找到了解决问题的方法,甚至找到了错误的原因。
DataContext 没有刷新,所以它仍然有旧的主键,因此抛出重复键的错误。
为了解决问题,我添加了以下代码:
db.GetType().InvokeMember(
"ClearCache",
BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
null, db, null);
我只是从 DataContext 调用了一个实习生方法,这就成功了。
首先是我的数据库结构和我的程序。
我有一个包含 3 tables 的简单数据库。
- 服务器
- 资源
- Avg_ressources
资源和 Avg_Ressources 包含来自服务器的外键。两者还包含一个主键。
我的程序每秒将 cpu 使用情况、内存使用情况和时间写入资源 table。写作部分在一个线程中(这背后的原因是我从多个服务器通过网络通过流获取信息)
在另一个线程中,我 运行 一个 class 具有将资源 table 中的数据分组并将它们插入 Avg_Usage table 的方法。到目前为止,一切都按预期工作。
下面是错误的部分。
将数据插入 table 后,我尝试使用
从旧的 table 中删除数据db.ExecuteCommand("TRUNCATE TABLE Ressources")
db 在这种情况下是我的 DataContext。来自 Ressources 的数据被删除,但主键仍然包含相同的值。在下一次插入时,程序会触发以下错误 + stacktrace
System.Data.Linq.DuplicateKeyException
System.Data.Linq.ChangeProcessor.PostProcessUpdates(List`1 insertedItems, List`1 deletedItems) at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)
at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
at System.Data.Linq.DataContext.SubmitChanges()
我已经试过了db.ExecuteCommand("DBCC CHECKIDENT (Ressources, RESEED, 0)");
但也没有成功。 请注意,在将数据插入 Ressources 之前,我还尝试使用 db.Refresh,但这并没有解决问题。当我通过 sql 服务器管理器直接在数据库上使用命令时,它工作正常。
现在我的问题是:
我是否必须停止我的其他线程才能实际重置密钥?
所以我找到了解决问题的方法,甚至找到了错误的原因。
DataContext 没有刷新,所以它仍然有旧的主键,因此抛出重复键的错误。
为了解决问题,我添加了以下代码:
db.GetType().InvokeMember(
"ClearCache",
BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
null, db, null);
我只是从 DataContext 调用了一个实习生方法,这就成功了。