请教一些比较迷糊的问题,没事大家进来说说吧。

时间:2020-11-30 19:53:39
页面获取数据时是用DataSet 好还是 DataReader 好?最近写的一个网站发现老是出现   超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
网上看了些资料,也检查了一下写的代码,发现都进行了关闭。
错误出现在 

行 36:         SqlDataAdapter da = new SqlDataAdapter(cmd);
行 37:         DataSet ds = new DataSet();
行 38:         da.Fill(ds);
行 39:         return ds.Tables[0];
行 40:     }

以前在外面租的服务器时没出现过,可最近是用自己公司的服务器,就会出现这种问题。

发现有种快疯的感觉。

10 个解决方案

#1


咋就没人给点意见呢?

在什么情况下用DataSet 在什么情况下 DataReader ?

#2


DataSet:数据集。一般包含多个DataTable,用的时候,dataset["表名"]得到DataTable  
    
  DataTable:数据表。  
  一:  
  SqlDataAdapter  da=new  SqlDataAdapter(cmd);  
  DataTable  dt=new  DataTable();  
  da.Fill(dt);  
    
  -----------------  
  直接把数据结果放到datatable中,  
  二:  
  SqlDataAdapter  da=new  SqlDataAdapter(cmd);  
  DataSet  dt=new  DataSet();  
  da.Fill(dt);  
  ----------------  
  数据结果放到dataset中,若要用那个datatable,可以这样:dataset[0]  
  更常见的用法:  
  SqlDataAdapter  da=new  SqlDataAdapter(cmd);  
  DataSet  dt=new  DataSet();  
  da.Fill(dt,"table1");  
  用的时候:这样取datatable:      
  dataset["table1"]  
  


DataSet不能直接用来存储数据,如果仅用DataSet,它会自动的生成一个DataTable,所以看上去就像一个DataTable。  
    
  如果有很多个DataTable需要同时绑定到某个控件,就可以把多个DataTable添加到一个DataSet中,分别起不同的名字就可以了Top 
DataReader基于连接,它返回的数据是只读只向前的,适合简单地浏览且耗时比较短的操作。DataSet对象会将所需数据读入内存然后断开连接。它适合对数据进行复杂长时间的操作,并且需要更新数据的情况。Top 

SqlDataReader只是建立与数据库之间的类似于一个指针关系,在没有调用Read()方法之间它不从数据读出任何数据,而在调用Read()时也只是从数据库中读出一条数据.DATATABLE是数据表的一个复本,至于DataSet可以反它看作一个数据库,因为它不但可以包括多个表而且还能包括各表之间的关系.所以在进行大量数据访问时(特别是分页方式的访问)建议使用SqlDataReader,这样可以节省大量的内存开销.Top 

DataSet就像内存数据库,  
  DataTable就是表,  
  库可以包含多个表,也可以包含表之间的关系。 

#3


谢谢。

#4


dataset占用资源比较大,不过读取,写入可以随意,reader只能前向,资源消耗比较小。

#5


dataset 会憋开 连接数据库 

而 dataReader 与数据库一直保持连接状态

#6


mark

#7


单向的获取数据建议用SqlDataReader,速度要比DataSet好,如果双向传递可以考虑DataSet 不过要考虑到数据一致性的问题(DataSet 是存储在客户端的内存里,虽然减少了与服务器的交互,但是内存里的多份数据拷贝在传回数据库的时候有可能发生数据冲突,如谁先谁后的问题等)

#9


引用 7 楼 yanlong521521 的回复:
单向的获取数据建议用SqlDataReader,速度要比DataSet好,如果双向传递可以考虑DataSet 不过要考虑到数据一致性的问题(DataSet 是存储在客户端的内存里,虽然减少了与服务器的交互,但是内存里的多份数据拷贝在传回数据库的时候有可能发生数据冲突,如谁先谁后的问题等)


单向和双向的区别在那儿啊,是不是一个是只读,一是可读可写啊。

#10


引用 8 楼 lovely_baby 的回复:
http://hi.baidu.com/haicheng00/blog/item/51ea9af01a764fc97931aa96.html


谢谢,这个我也看过到,也在链接里面加了 Max   Pool   Size=512  ,还没试过行不行呢。

#1


咋就没人给点意见呢?

在什么情况下用DataSet 在什么情况下 DataReader ?

#2


DataSet:数据集。一般包含多个DataTable,用的时候,dataset["表名"]得到DataTable  
    
  DataTable:数据表。  
  一:  
  SqlDataAdapter  da=new  SqlDataAdapter(cmd);  
  DataTable  dt=new  DataTable();  
  da.Fill(dt);  
    
  -----------------  
  直接把数据结果放到datatable中,  
  二:  
  SqlDataAdapter  da=new  SqlDataAdapter(cmd);  
  DataSet  dt=new  DataSet();  
  da.Fill(dt);  
  ----------------  
  数据结果放到dataset中,若要用那个datatable,可以这样:dataset[0]  
  更常见的用法:  
  SqlDataAdapter  da=new  SqlDataAdapter(cmd);  
  DataSet  dt=new  DataSet();  
  da.Fill(dt,"table1");  
  用的时候:这样取datatable:      
  dataset["table1"]  
  


DataSet不能直接用来存储数据,如果仅用DataSet,它会自动的生成一个DataTable,所以看上去就像一个DataTable。  
    
  如果有很多个DataTable需要同时绑定到某个控件,就可以把多个DataTable添加到一个DataSet中,分别起不同的名字就可以了Top 
DataReader基于连接,它返回的数据是只读只向前的,适合简单地浏览且耗时比较短的操作。DataSet对象会将所需数据读入内存然后断开连接。它适合对数据进行复杂长时间的操作,并且需要更新数据的情况。Top 

SqlDataReader只是建立与数据库之间的类似于一个指针关系,在没有调用Read()方法之间它不从数据读出任何数据,而在调用Read()时也只是从数据库中读出一条数据.DATATABLE是数据表的一个复本,至于DataSet可以反它看作一个数据库,因为它不但可以包括多个表而且还能包括各表之间的关系.所以在进行大量数据访问时(特别是分页方式的访问)建议使用SqlDataReader,这样可以节省大量的内存开销.Top 

DataSet就像内存数据库,  
  DataTable就是表,  
  库可以包含多个表,也可以包含表之间的关系。 

#3


谢谢。

#4


dataset占用资源比较大,不过读取,写入可以随意,reader只能前向,资源消耗比较小。

#5


dataset 会憋开 连接数据库 

而 dataReader 与数据库一直保持连接状态

#6


mark

#7


单向的获取数据建议用SqlDataReader,速度要比DataSet好,如果双向传递可以考虑DataSet 不过要考虑到数据一致性的问题(DataSet 是存储在客户端的内存里,虽然减少了与服务器的交互,但是内存里的多份数据拷贝在传回数据库的时候有可能发生数据冲突,如谁先谁后的问题等)

#8


#9


引用 7 楼 yanlong521521 的回复:
单向的获取数据建议用SqlDataReader,速度要比DataSet好,如果双向传递可以考虑DataSet 不过要考虑到数据一致性的问题(DataSet 是存储在客户端的内存里,虽然减少了与服务器的交互,但是内存里的多份数据拷贝在传回数据库的时候有可能发生数据冲突,如谁先谁后的问题等)


单向和双向的区别在那儿啊,是不是一个是只读,一是可读可写啊。

#10


引用 8 楼 lovely_baby 的回复:
http://hi.baidu.com/haicheng00/blog/item/51ea9af01a764fc97931aa96.html


谢谢,这个我也看过到,也在链接里面加了 Max   Pool   Size=512  ,还没试过行不行呢。