读书人

关于数据库connection与reader互相绑定

发布时间: 2012-10-17 10:25:47 作者: rapoo

关于数据库connection与reader相互绑定的疑问

C# code
    public SqliteDataReader ExecuteQuery(string sqlQuery)    {        try        {        this.connection.Open();            dbCommand = this.connection.CreateCommand();            dbCommand.CommandText = sqlQuery;            DataReader reader = dbCommand.ExecuteReader();            return reader;                }        catch (System.Exception ex)        {            Debug.Log(ex.ToString());        }        finally        {            this.connection.Close();        }        return null;    }



代码就是这样的. 但是不是ms平台的东西 , 所以部分关键字别较真.

我的意思是: 为什么DataReader reader = dbCommand.ExecuteReader(); 所获取到的 reader 必须是和 connection 绑定的呢? 因为当我 finally 把connection关闭的时候 这个方法返回的reader也不可用了.

但从数据的理论上理解, 我的reader凭什么跟你 sql的connection绑定起来? 有何绑定的必要呢?

从逻辑学角度. 无非就是利用 connection 获得了一个open的连接, 然后通过sql脚本把 数据抓到 connction 对象所控制的内存区域里, 然后 connction 再把这些数据吐出来, 吐给要返回的 reader 上. 然后规定 reader 和 connection没有绑定关系即可.

但是实际上. 不管是之前我在java中遇到的. 还是在c#中遇到的, 所有系统库都倾向于去提供一个 connection 与reader 绑定的访问方法. 这肯定有他的道理的. 但道理是什么呢? 我暂时没想明白. 因为我以为: 提供一个 connection与reader互相没有关系的方法是更有用的.

[解决办法]
DataReader并没有把你查的所有数据都放在本地,所以Connection不能销毁。
javax.sql.rowset.CachedRowSet 不懂,根据你的描述应该就是一次性读取数据到本地,.net里可以用DataTable,多张表的话用DataSet,这时connection是可以销毁的。
[解决办法]
一本书你不打开你能读么?
[解决办法]
探讨

引用:

一本书你不打开你能读么?


我说朋友, 你不能这么说啊, 你得动动你的脑筋去想问题,而不是被 类库 所局限死. 就算被局限了, 你也得去理解,别人为什么要这么局限对吧.

我给你举个简单例子:
如果我获得reader之后, 直接在 connection.close之前 把所有 reader 内的数据预读出来, 放进一个 string里,用 *分割. ……

读书人网 >C#

热点推荐