日期:2014-05-17  浏览次数:20827 次

SqlConnection、SqlCommand、SqlDataReader这一系列不太好用啊
俺以前习惯使用System.Data.Oledb命名空间那一套。喜欢直接用Command执行命令,DataSet用得不多。最近为了使用SqlDependency,故开始使用SqlClient下面的那堆对象。

类名称改了过来,发现许多本来完全正常的查询全部运行不了。试看:
SqlCommand Cmd = new SqlCommand("Select Count(*) From MyTb", DBconn);
object ObjCount = Cmd.ExecuteScalar();
子程序首两行就是这两句,他居然提示“已有打开的与此命令相关联的 DataReader,必须首先将它关闭。”


还有,俺使用SqlDataReader来检索数据,同样的表,查询1:查出多条满足条件的记录(按日期查);查询2:查询选定条目的详细信息(按nvarchar查)
问题是:查询1很正常,遇到查询2却马上退出程序,后续的代码都不执行。

昨天用Oledb中的对象是完全正常的,到底是SQLclient里面的东西本来就不能使用,还是我用得不对,有什么需要注意的吗?

------解决方案--------------------
没关闭链接?
不闭本来就是很危险的事情.用using()
或者自己封装好,必须关闭.
------解决方案--------------------
SqlDataReader使用完后,要记得手动Close()
------解决方案--------------------
你干嘛一定要用IDataReader呢???
你完全可以Fill到DataSet,然后对DataSet操作

DataSet完全可以等价关系型数据库
------解决方案--------------------
引用:
俺以前习惯使用System.Data.Oledb命名空间那一套。喜欢直接用Command执行命令,DataSet用得不多。最近为了使用SqlDependency,故开始使用SqlClient下面的那堆对象。

类名称改了过来,发现许多本来完全正常的查询全部运行不了。试看:
SqlCommand Cmd = new SqlCommand("Select Count(*) From MyTb", DBconn);
object ObjCount = Cmd.ExecuteScalar();
子程序首两行就是这两句,他居然提示“已有打开的与此命令相关联的 DataReader,必须首先将它关闭。”


还有,俺使用SqlDataReader来检索数据,同样的表,查询1:查出多条满足条件的记录(按日期查);查询2:查询选定条目的详细信息(按nvarchar查)
问题是:查询1很正常,遇到查询2却马上退出程序,后续的代码都不执行。

昨天用Oledb中的对象是完全正常的,到底是SQLclient里面的东西本来就不能使用,还是我用得不对,有什么需要注意的吗?


dataReader,ExcuteNoQuery,ExecuteScalar这几个对象在调用的时候都必须要打开Connection,但是切记:打开使用完成后记得要关闭,
如果是查询表(多表)或者返回多条记录,建议你可以用DataAdapter,不需要打开和关闭!Fill方法填充数据!