如果只需要获取一行记录,大家一般用什么方法?
在获取数据库记录的时候,如果只需要获取一行记录,大家一般用什么方法?好像datareader很容易导致连接池的问题。。
改成获取dataset好多了。。。 --------------------编程问答-------------------- 我用datatable --------------------编程问答-------------------- SQL里面:Top 1 --------------------编程问答-------------------- top 1 datatable --------------------编程问答-------------------- 一行记录用datareader啊,但是要记得close。一般不会有问题的,如果可能出现问题用try-catch-finally --------------------编程问答-------------------- DataReader和DataTable都可以,也可以自己封装个方法,写到SQLHelper里。 --------------------编程问答--------------------
也不一定吧,因为datareader好像是“线程池独占”(这方面我不了解)的,所以如果大量用datareader的话容易导致线程池不够用。。。 --------------------编程问答-------------------- 其实就一条记录 什么方式无伤大雅 --------------------编程问答--------------------
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 =>--------------------编程问答-------------------- 如果你的程序是强类型编程的,那么没有必要使用DataTable、DataSet那种沉重地装箱拆箱并且要包装成内存数据库的东西。轻量级地直接返回对象列表或者集合,会更好。 --------------------编程问答--------------------
new DataType
{
X = (string)reader["field1"],
Y = (int)reader["field2"]
}).ToList();
楼上说的很完整,DataReader和Dataset并不是一个层次上的概念,Datareader是你和你的数据持久化层(也就是你的数据库)打交道的接口,一定要比较的话,DataAdapter勉强可以。一行数据显然DataAdapter的Fill比Datareader更消耗资源,而 DataCommand.ExecuteReader(CommandBehavior.SingleRow).GetValues(Object())显然更简洁些。 --------------------编程问答-------------------- 如果有看过DataSet DataTable内部填充数据的方法 就会发现是调用DataReader来读取数据的...不过使用时注意关闭就ok了 --------------------编程问答--------------------
呵呵,我上面举例的 GetRecords<T> 也是调用 DataReader 的呢!
其实谁也没有纠结于要不要调用 datareader,而是在于楼主所说的“导致连接池的问题”等方面。 --------------------编程问答-------------------- --------------------编程问答--------------------
你好,这里不需要reader.Close()了吗? --------------------编程问答--------------------
任何查询都是一个设计文档接口的实现,数据集就是数据集,转换成所谓强类型是多余的
并且,纵然是要转换,微软的ado.net也提供从设计文档接口自动匹配数据集,输出类型化数据对象的能力,
微软的样本程序是通过xml格式自动匹配的 --------------------编程问答-------------------- 使用DataReader、转DataTable、关闭DataReader、返回DataTable --------------------编程问答-------------------- 或者
使用DataReader、转<List>、关闭DataReader、返回<List> --------------------编程问答-------------------- 来凑个热闹,赚点分。。。 --------------------编程问答--------------------
....
那是因为 你datareader没断开!
--------------------编程问答-------------------- top 1 datatable --------------------编程问答--------------------
补充:.NET技术 , ASP.NET