微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ADO.net的SqlConnection问题

挺早以前的帖子了,

Ado.net间歇性出现莫名其妙问题的一种解决办法

====================================================

某网友来信

程序代码中写“select column1 from table1”
返回DataSet ds
有时候访问ds.Table[0]提示:Cannot find table 0.
有时候访问ds.Table[0].Rows[0]["column1"]提示:Column “column1” does not belong to table Table
大部分情况下,程序正常,但是偶尔会出现上面的错误
因此,我考虑,是不是sqlServer本身返回ds的时候就没有正确的返回结果?但是什么会导致sqlServer没有正确的返回ds呢?大家帮我想想,拜托了。
我也是有时候出现你的这个问题,不知道怎么解决

=======================================================

因为有几个网友都来信问过此类问题,所以我统一回复一下。一般出现此类问题,就应该是连接出问题了。

  • Asp.net和WebService的程序,都是多线程的,一般有多少人同时访问,就有多少个sqlConnection。
  • 数据库的连接数量一般时几十个,总数是比线程数量要小(并发可以达到几百,连接数只有几十)。这就是为什么说晚申请,早释放的原因,因为数据库连接的资源是非常宝贵的。
  • sqlConnection的Close方法是把Connection还给连接池,而dispose的方法是彻底关闭和释放连接。因此,在程序中 切记不可手工调用dispose的方法 。一是不安全,二是效率不高。
  • 在程序中,有一些人喜欢用Static的sqlConnection,这也是不对的, 在多线程的情况下, 请避免使用静态sqlConnection实例 。静态实例,在多线程情况下,会产生系统紊乱。
  • 还有一些在程序中忘记Close,看起来不会有什么问题,但是会导致连接耗尽,系统的并发数量上不去。因此, 使用完毕尽快关闭数据库连接
  • 出现此类问题的原因,我感觉是程序中 调用了Close,再调用了D ispose,假如Thread1申请了sqlCon1,Close后,sqlCon1还给了线程池,但是Thread1还是持有sqlCon1对象,Thread2这时候申请连接,线程池把sqlCon1给了Thread2,sqlCon1在执行查询时,Thread1调用sqlCon1的dispose,那么此时发生了什么?肯定Thread2的查询被中断,你去访问DataSet中的Table或者Table中的Column,就会没有。出现此类问题,只有一个解释:查询被中断了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐