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

关于数据库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里,用 *分割. ……