【问题标题】:C# / Sql Server 2008 INSERT int value grows automatically to 1000000C#/Sql Server 2008 INSERT int 值自动增长到 1000000
【发布时间】:2014-12-16 15:53:37
【问题描述】:

我最近遇到一个奇怪的问题,在 Sql Server 2008 中只出现过一次。

我在 .net Web 应用程序 (C#) 中工作,并使用 SqlCommand 访问我的数据库并执行查询。我的流程如下:

  1. 我有一个视图可以让我获得特定表中存在的最大数量:

    选择 MAX(数字) 作为 MaxNumber 来自我的表

  2. 我在一个变量中获取了这个 MaxNumber,并使用这个变量在 MyTable 中执行插入操作,MaxNumber + 1。这样,我总是在 MyTable 中记录最大数量

从一周前的一次开始,它运行良好,突然,我看到一个从 134200 到 1000000 的 MaxNumber!

我调查了我的代码,但不可能是这种行为的原因。我还检查了 Web 服务器的日志,没有抛出错误插入的日志。

我还查看了 Sql Server 的日志,但没有发现错误日志...

可疑的是,该数字从“普通”数字 (134200) 传递到“特定”数字 (1000000)。为什么是 1000000 ?为什么不是 984216 或 1000256?

有人遇到过同样的问题吗?

感谢您的帮助。

编辑 - 2014-12-23:

我进一步分析了这个问题,它似乎是在我在 PreProd 环境中恢复备份时发生的。

我解释一下:我有 PreProd 服务器,我有一个 Sql Server 实例 (PreProd),我有一个 Prod 服务器,我还有一个 Sql Server 实例 (Prod),每天都在同一台服务器上备份。

当我想使用有效数据进行测试时,我会在我的 PreProd 数据库上恢复 Prod 备份:

RESTORE DATABASE PreProd
FROM DISK = '\\Prod\Backup\SQL\Prod.bak'
WITH MOVE 'Prod' TO 'E:\Bases\Data\PreProd.mdf',
MOVE 'Prod_log' TO 'E:\Bases\Data\PreProd.ldf',
REPLACE

问题发生在我恢复备份的同一天。 “1000000 行”出现在我恢复的同一时刻,在我的 Prod 数据库中。有没有关联的可能性? Prod 服务器是否被我的 PreProd 服务器执行的 restore 命令淹没了,最终导致同时发生的 Insert 请求崩溃?

感谢您的建议

【问题讨论】:

  • 那是一个身份列
  • 将值恢复为134201会发生这种情况吗?
  • 我假设 MyTable 中有 1000000 的记录,而 134201 - 999999 没有记录
  • @NoDisplayName : 不,这不是身份列
  • @faby : 今天下午我将恢复 134201 的值

标签: c# sql-server sql-server-2008 sql-server-2008-r2


【解决方案1】:

我唯一能想到的是,也许您使用ExecuteScalar 方法获得了 maxValue 而没有将结果转换为正确的数据类型

var max= cmd.ExecuteScalar();

然后

max= max+1;

否则我看到你的 sqlServer 版本在使用 SCOPE_IDENTITY()@@IDENTITY 时可能会收到不正确的值

请参考here 进行错误修复,您应该更新到SQL Server 2008 R2 Service Pack 1

【讨论】:

  • 我使用 SqlCommand.ExecuteReader() 阅读了我的观点。然后我阅读我的 SqlDataReader (SqlDataReader.Read()) 以获得第一个结果,选择好的字段 (SqlDataReader["MaxNumber"])。
  • 你应该使用 ExecuteScalar 方法来进行这种查询。这只是一个建议
  • 鉴于 max+1 方法,@@IDENTITY 似乎不会成为问题。
猜你喜欢
  • 2017-07-28
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多