我们的一个VS .NET 2008窗体应用程序从多个客户机运行。 应用程序会随机地从随机机器和代码中随机的地方login失败。 login工作几乎每次,但大约每十五分钟一次,从随机用户的SQL Server错误日志中显示一个错误。 我们正在运行一个集群SQL Server 2005系统,数据库处于2005(90)模式。
以下错误出现在SQL Server错误日志中:
login失败的“App_Login”。 [客户端:XXX.XXX.X.XXX]错误:18456,严重性:14,状态:16。
以下错误是客户看到的:
System.Data.SqlClient.SqlException:将请求发送到服务器时发生传输级别错误。 (提供程序:TCP提供程序,错误:0 – 现有连接被远程主机强制closures。)
该应用程序使用的连接string是:
Data Source=XX.XXX.XXX.XXX;Network Library=DBMSSOCN;Initial Catalog=document7;User Id=App_Login;Password=PASSWORDHERE;
(注意:XXX.XXX.X.XXX和XX.XXX.XXX.XXX是IP地址)
感谢您的时间和任何帮助!
在这种情况下,我认为SQL Server的错误不像客户端错误那样暴露。 客户端错误指出,连接已经存在,并被切断,我认为是更准确的描述正在发生的事情。 这篇博文解释了这个问题。
基本上,由于某种原因池中的连接被切断(可能不活动或者networkingblip),并且客户端不知道连接被切断,直到它运行另一个查询。 这就解释了为什么这个问题只发生在我们的Windows窗体的应用程序中,因为这个应用程序会使连接长时间处于非活动状态。 此外,Web应用程序与数据库服务器处于相同的物理位置,因此在networking上不会有太多的连接问题。
要解决这个问题,我只需要检查错误并重新运行查询第二次。 该查询应该第二次工作,因为它会自动接收一个新的SPID和一个全新的连接。
检查这个博客 。 确保你看看下面的评论和讨论其中之一说:
“(错误:18456,严重性:14)状态:16表示传入的用户没有login到目标数据库的权限,例如说你创build一个用户FOO并设置FOO的默认数据库为master,但是FOO没有权限login到主“。