[找到问题了.Net丫丫]TCP Provider, error: 0 - An existing connection was forcibly closed
时间:2011-05-16 来源:mrytsr
×先看淫图一张了,到这边的同学大都是因为这一张图了。
×昨天晚上第一次看到这个图的时候本人惊愕,与以前数据库连接失败的图有所不同了,Catch到的位置都是执行数据库查询语句的地方了,打出来的的ex.message了
百思不得其解,CSDN的几篇讨论也没有解决我心中的疑问了
http://topic.csdn.net/t/20060818/10/4958439.html
http://topic.csdn.net/u/20080414/17/92c6fd6c-b39f-42a7-80f3-4852623e51c4.html
http://topic.csdn.net/t/20060829/17/4984424.html
其他的讨论包括百度一个博客的文章也没有给出很好的解释了
http://hi.baidu.com/dbaren/blog/item/410bbf2fe1e69d3d1e30890d.html
http://blog.zxlm.cn/2008/04/provider-tcp-provider-error-0-%E6%82%A8%E7%9A%84%E4%B8%BB%E6%9C%BA%E4%B8%AD%E7%9A%84%E8%BD%AF%E4%BB%B6%E6%94%BE%E5%BC%83%E4%BA%86%E4%B8%80%E4%B8%AA%E5%B7%B2%E5%BB%BA%E7%AB%8B%E7%9A%84%E8%BF%9E.html
次日到公司执行相同的程序似乎问题又不出现了,增加了我的好奇了
×本想试试数据库短连接功能了,就是连接好数据库,进行过成功操作的Connection,这个时候断网,然后重新连接,然后对这个Connection进行sql语句的查询了
×这个时候,大部分同学是可以成功的,不能成功的同学就可能会得到上面的错误了,得到上面的错误的同学不外乎就是本地的网路环境改变了
两种情况会导致本地的网络环境改变了,
1.断网前后连接的不是同一个路由器(IP地址改变了)
2.断网前后连接的算然是同一个机器,但是那头是猫或者ChinaNet这样子在断网前后会得到不同的IP的连接设备了
看看伪代码了,
void Button_Click()
{
strConn = “user id = ppp; password = ppp ;database = aaa;Server =xxx.xxx.xxx.xxx,1433;Connect Timeout = 1”;
SqlConnection Connect = new SqlConnection(strConn);
strConn.Query("select * from tabel_name");
Connect.dispose();
}
大家注意了,我分明在Click的末尾将Connect.dispose()掉了,下次的click将会启用一个全新的connect,这个全新new出来的connect将会和老的Connect没有任何关系了,为什么还会出现上述问题呢?
问题的出现,相当于程序把断网前后的Connect看做是同一个了(但我分明dispose()了)
问题就出在
strConn = “user id = ppp; password = ppp ;database = aaa;Server =xxx.xxx.xxx.xxx,1433;Connect Timeout = 1”;
大家不妨试一试,设法让断网之后的连接字符串---多一个空格(比如在末尾或者哪个分号的前后),完全不影响功能那种了
再测试,断网前(没括号),断网后(有括号)----问题解决了,成功new了一个新对象了。。。。
结论:似乎.Net在第一次使用
SqlConnection Connect = new SqlConnection(strConn);
初始化连接的时候,会把这一次的连接信息
1.StrConn里面的信息,
2×当前网络的状态
存在内存里面,在connect里面的只是一份拷贝了,
但是 new SqlConnection(strConn); 的时候,
一看到同样的连接字符串的时候就把内存里面那个字符串的连接调了出来,重新赋值给那个空的Connection,
却不会理会网络环境是否改变(这是关键)
就这样子,新的环境VS老的连接,上面的问题发生了
后来试了一下,不需要断网,在局域网里面的话,换一个IP(虽然前后都能连接网络了) ,问题也同样子发生了进一步证明了上面的结论了