打开SQL连接时出现算术溢出异常

15

打开与底层 SQL 数据库的 SQL 连接时,我遇到了非常奇怪的 ArithmeticOverflowException(如下所示的堆栈跟踪)。不管使用哪个版本的服务器(我已验证 MS SQL 2005/2008/2012/2014),错误仍然是相同的。安装了来自 Windows 更新的所有最新更新和补丁。操作系统为 Windows 8.1 / 10(两个系统都发生了相同的情况)。服务器是本地安装的,连接是通过用户名和密码进行的。在 15 到 1000 秒的范围内验证了连接超时。

最令人惊讶的是,应用程序运行良好,并与服务器正确通信,执行了许多不同的查询,但突然出现了这个异常。我注意到这个异常在某个 windows 更新之后开始出现(不知道是哪个更新)。

我查看了 .NET 代码,但不知道那里可能导致算术溢出异常...

-- 堆栈跟踪 --

in SNIOpenSyncExWrapper(SNI_CLIENT_CONSUMER_INFO* , SNI_ConnWrapper** )
in SNINativeMethodWrapper.SNIOpenSyncEx(ConsumerInfo consumerInfo, String constring, IntPtr& pConn, Byte[] spnBuffer, Byte[] instanceName, Boolean fOverrideCache, Boolean fSync, Int32 timeout, Boolean fParallel)
in System.Data.SqlClient.SNIHandle..ctor(ConsumerInfo myInfo, String serverName, Byte[] spnBuffer, Boolean ignoreSniOpenTimeout, Int32 timeout, Byte[]& instanceName, Boolean flushCache, Boolean fSync, Boolean fParallel)
in System.Data.SqlClient.TdsParserStateObject.CreatePhysicalSNIHandle(String serverName, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Byte[]& instanceName, Byte[] spnBuffer, Boolean flushCache, Boolean async, Boolean fParallel)
in System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean withFailover)
in System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover)
in System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout)
in System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance)
in System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData)
in System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
in System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions)
in System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
in System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
in System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
in System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
in System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
in System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
in System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
in System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
in System.Data.SqlClient.SqlConnection.Open()

你能否稳定地重现这个问题吗?是一个应用程序还是多个应用程序出现这个问题? - Dan Field
你的代码中有没有使用checked关键字进行整数加法运算?请提供完整的异常信息。 - user1666620
你知道错误发生在哪一行代码上吗?能否将该行代码及其所在的代码块发布出来? - Tab Alleman
你需要确定错误发生的位置并在此处展示代码。找出用户体验错误的确切步骤,以及它发生在哪些记录上。然后复制数据库并复制他们的步骤,设置断点以弄清楚发生了什么。目前没有足够的信息来确定错误的原因。 - user1666620
1
说实话,最好向微软支持提交工单。 - user1666620
显示剩余6条评论
6个回答

20

我也遇到了同样的问题,Lavasoft也是一个原因。

我检查了“程序和功能”,看看是否有任何Lavasoft程序,惊讶地发现了一个叫做Lavasoft的WebCompanion应用程序。我还发现有一个正在运行的服务LavasoftTcpService。

  1. 我停止了服务LavasoftTcpService(从services.msc)
  2. 我从“程序和功能”中卸载了WebCompanion。
  3. 上述两个dlls(C:\ Windows \ System32和C:\ Windows \ SysWOW64中的LavasoftTcpService.dll和LavasoftTcpService64.dll)仍然存在。我更改了它们的名称,问题就解决了。

在执行这些步骤之前,我尝试仅更改dll的名称,但是出现了一个问题,无法解析localhost:系统寻找0.0.0.0而不是127.0.0.1。Ping会给我一个错误消息:“Ping请求无法找到主机localhost。请检查名称并重试。”

这3个步骤解决了问题。


我按照步骤进行了操作,并且已经检查了几天,似乎有所帮助。从那时起,问题就没有再出现了。也许应该向Lavasoft抱怨一下什么的... - Bronek
谢谢你,我真的无法理解我的同事 SQL Server 发生了什么,任何从 C# 程序调用 Open connection 的操作都会在 SQL Client 上产生这种荒谬的溢出错误。有人应该向 Lavasoft 发送一条消息。 - Sabrina_cs
我无法看到问题的根源,但它简单地工作了。非常感谢! - Oswald

11
我们曾经遇到过同样的问题,它是由于 LavasoftTcpService64.dll 引起的。摆脱它并不是那么 容易, 但可以解决问题。检查以下文件夹是否存在该文件: C:\WindowsC:\Windows\System32C:\Windows\SysWOW64。感谢Nguyen Quy Hy找到了根本原因。

2
还有其他情况,比如这个SO问题,是由不同的问题引起的。 - Panagiotis Kanavos

3

我确认罪魁祸首是Lavasoft Ad-Aware或WebCompanion。在调用SqlConnection.Open()时,只有使用LocalDB才会抛出System.OverflowException异常。

有趣的是,如果您的应用程序是单实例应用程序,则崩溃总是发生,否则它会随机发生。

解决方案就是Ursula所说的。


2

我曾经遇到了同样的问题,即无法安装 Azure 存储模拟器,也就是说,AzureStorageEmulator.exe start 会产生类似的堆栈跟踪和异常。我可以初始化模拟器,但无法启动它。删除 Lavasoft dll 并重置 winsock 栈解决了这个问题。所以对我有用,同样要感谢 Nguyen Quy Hy 和这篇文章。


2
我使用EntityFramework创建用户时遇到了同样的问题,通过以下步骤找到并解决了这个问题:
  1. 停止LavasoftTcpService64服务;
  2. 从“程序和功能”中卸载Web Companion程序;
  3. 如果问题仍然存在,请重新启动计算机。希望这可以帮助你。

1

我刚遇到了这个错误,这里的第二个选项帮助了我。

  1. 请以管理员身份启动命令提示符,右键单击它并选择“以管理员身份运行”。

  2. 输入以下命令以重置网络适配器(以 Enter 键结束):
    netsh winsock reset

  3. 重新启动计算机。

  4. 请删除这两个文件:
    C:\WINDOWS\system32\LavasoftTcpService64.dll C:\WINDOWS\SysWOW64\LavasoftTcpService.dll (仅适用于 64 位 Windows)

我将文件重命名而不是删除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接