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,就会没有。出现此类问题,只有一个解释:查询被中断了。

你可能感兴趣的:(thread,多线程,webservice,table,sqlserver,dataset)