当前位置:编程学习 > C#/ASP.NET >>

如果只需要获取一行记录,大家一般用什么方法?

在获取数据库记录的时候,如果只需要获取一行记录,大家一般用什么方法?

好像datareader很容易导致连接池的问题。。


改成获取dataset好多了。。。 --------------------编程问答-------------------- 我用datatable --------------------编程问答-------------------- SQL里面:Top 1 --------------------编程问答-------------------- top 1  datatable --------------------编程问答-------------------- 一行记录用datareader啊,但是要记得close。一般不会有问题的,如果可能出现问题用try-catch-finally --------------------编程问答-------------------- DataReader和DataTable都可以,也可以自己封装个方法,写到SQLHelper里。 --------------------编程问答--------------------
引用 5 楼  的回复:
DataReader和DataTable都可以,也可以自己封装个方法,写到SQLHelper里。


也不一定吧,因为datareader好像是“线程池独占”(这方面我不了解)的,所以如果大量用datareader的话容易导致线程池不够用。。。 --------------------编程问答-------------------- 其实就一条记录 什么方式无伤大雅 --------------------编程问答--------------------
引用楼主  的回复:
在获取数据库记录的时候,如果只需要获取一行记录,大家一般用什么方法?

好像datareader很容易导致连接池的问题。。


改成获取dataset好多了。。。


datareader并不是记录行的概念。这就好像说你想买一桶汽油人家是不是要把一个油田送给你?

而datatable才是跟数据库连接真正断开的。所以在“一般”的情况下,应该考虑datatable。只有调用者能够负责任地尽快清理datareader,你才可以返回datareader。(因此最好的做法就是从来也不向外返回datareader)。
--------------------编程问答-------------------- 对于懂得委托和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();
--------------------编程问答-------------------- 如果你的程序是强类型编程的,那么没有必要使用DataTable、DataSet那种沉重地装箱拆箱并且要包装成内存数据库的东西。轻量级地直接返回对象列表或者集合,会更好。 --------------------编程问答--------------------
引用 8 楼  的回复:
datareader并不是记录行的概念。这就好像说你想买一桶汽油人家是不是要把一个油田送给你?

而datatable才是跟数据库连接真正断开的。所以在“一般”的情况下,应该考虑datatable。只有调用者能够负责任地尽快清理datareader,你才可以返回datareader。(因此最好的做法就是从来也不向外返回datareader)。

楼上说的很完整,DataReader和Dataset并不是一个层次上的概念,Datareader是你和你的数据持久化层(也就是你的数据库)打交道的接口,一定要比较的话,DataAdapter勉强可以。一行数据显然DataAdapter的Fill比Datareader更消耗资源,而 DataCommand.ExecuteReader(CommandBehavior.SingleRow).GetValues(Object())显然更简洁些。 --------------------编程问答-------------------- 如果有看过DataSet DataTable内部填充数据的方法 就会发现是调用DataReader来读取数据的...不过使用时注意关闭就ok了 --------------------编程问答--------------------
引用 12 楼  的回复:
如果有看过DataSet DataTable内部填充数据的方法 就会发现是调用DataReader来读取数据的...不过使用时注意关闭就ok了

呵呵,我上面举例的 GetRecords<T> 也是调用 DataReader 的呢!

其实谁也没有纠结于要不要调用 datareader,而是在于楼主所说的“导致连接池的问题”等方面。 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 9 楼  的回复:
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);
    }
}

你好,这里不需要reader.Close()了吗? --------------------编程问答--------------------
引用 10 楼  的回复:
如果你的程序是强类型编程的,那么没有必要使用DataTable、DataSet那种沉重地装箱拆箱并且要包装成内存数据库的东西。轻量级地直接返回对象列表或者集合,会更好。

任何查询都是一个设计文档接口的实现,数据集就是数据集,转换成所谓强类型是多余的
并且,纵然是要转换,微软的ado.net也提供从设计文档接口自动匹配数据集,输出类型化数据对象的能力,
微软的样本程序是通过xml格式自动匹配的 --------------------编程问答-------------------- 使用DataReader、转DataTable、关闭DataReader、返回DataTable --------------------编程问答-------------------- 或者
使用DataReader、转<List>、关闭DataReader、返回<List> --------------------编程问答-------------------- 来凑个热闹,赚点分。。。 --------------------编程问答--------------------
引用楼主  的回复:
在获取数据库记录的时候,如果只需要获取一行记录,大家一般用什么方法?

好像datareader很容易导致连接池的问题。。


改成获取dataset好多了。。。

....
那是因为 你datareader没断开!
--------------------编程问答-------------------- top 1 datatable  --------------------编程问答--------------------
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,