在获取数据库记录的时候,如果只需要获取一行记录,大家一般用什么方法?好像datareader很容易导致连接池的问题。。
改成获取dataset好多了

解决方案 »

  1.   

    一行记录用datareader啊,但是要记得close。一般不会有问题的,如果可能出现问题用try-catch-finally
      

  2.   

    DataReader和DataTable都可以,也可以自己封装个方法,写到SQLHelper里。
      

  3.   


    也不一定吧,因为datareader好像是“线程池独占”(这方面我不了解)的,所以如果大量用datareader的话容易导致线程池不够用
      

  4.   


    datareader并不是记录行的概念。这就好像说你想买一桶汽油人家是不是要把一个油田送给你?而datatable才是跟数据库连接真正断开的。所以在“一般”的情况下,应该考虑datatable。只有调用者能够负责任地尽快清理datareader,你才可以返回datareader。(因此最好的做法就是从来也不向外返回datareader)。
      

  5.   

    对于懂得委托和lamda的人,再设计SQLHelper的时候可以直截了当地返回用户需要的对象集合,而不是任何一种中间数据结构。既然是“用户需要的”的对象,而此对象类型肯定是在SQLHelper之后才开发的,那么SQLHelper中自然就需要基于泛型技术来编码。具体来说就是写成类似这样的代码:public static IEnumerable<T> GetRecords<T>(string sql, Func<DbDataReader, T> callback)
    {
        using (var conn = GetDBConnection())
        {
            var comm = conn.CreateCommand();
            comm.CommandText = sql;
            var reader = comm.ExecuteReader();
            while (reader.Read())
                yield return callback(reader);
        }
    }
    它直接返回T的对象实例的列表。
    假设应用程序实体类型是:        public class DataType
            {
                public string X;
                public int Y;
            }那么应用程序可以这样调用SQLHelper的相应方法:var sql = "select field1,field2 from myTable where field3>10000";
    var result = GetRecords<DataType>(sql, reader =>
                    new DataType
                    {
                        X = (string)reader["field1"],
                        Y = (int)reader["field2"]
                    });
    foreach (var r in result)
    {
        打印(r);
    }或者直接返回一个List<T>:var result = GetRecords<DataType>("select field1,field2 from myTable where field3>10000", reader =>
                    new DataType
                    {
                        X = (string)reader["field1"],
                        Y = (int)reader["field2"]
                    }).ToList();
      

  6.   

    如果你的程序是强类型编程的,那么没有必要使用DataTable、DataSet那种沉重地装箱拆箱并且要包装成内存数据库的东西。轻量级地直接返回对象列表或者集合,会更好。
      

  7.   

    楼上说的很完整,DataReader和Dataset并不是一个层次上的概念,Datareader是你和你的数据持久化层(也就是你的数据库)打交道的接口,一定要比较的话,DataAdapter勉强可以。一行数据显然DataAdapter的Fill比Datareader更消耗资源,而 DataCommand.ExecuteReader(CommandBehavior.SingleRow).GetValues(Object())显然更简洁些。
      

  8.   

    如果有看过DataSet DataTable内部填充数据的方法 就会发现是调用DataReader来读取数据的...不过使用时注意关闭就ok了
      

  9.   

    呵呵,我上面举例的 GetRecords<T> 也是调用 DataReader 的呢!其实谁也没有纠结于要不要调用 datareader,而是在于楼主所说的“导致连接池的问题”等方面。
      

  10.   

    你好,这里不需要reader.Close()了吗?
      

  11.   

    任何查询都是一个设计文档接口的实现,数据集就是数据集,转换成所谓强类型是多余的
    并且,纵然是要转换,微软的ado.net也提供从设计文档接口自动匹配数据集,输出类型化数据对象的能力,
    微软的样本程序是通过xml格式自动匹配的
      

  12.   

    使用DataReader、转DataTable、关闭DataReader、返回DataTable
      

  13.   

    或者
    使用DataReader、转<List>、关闭DataReader、返回<List>
      

  14.   

    ....
    那是因为 你datareader没断开!