我有一个简单的应用程序,需要执行某些查询来获取数据库架构信息.我写了一个简单的方法来执行查询并返回一个读者,像这样 -
public static DbDataReader ExecuteQuery(DbConnection connection,string sql)
{
DbCommand command = connection.CreateCommand();
command.CommandText = sql;
using(command)
{
return command.ExecuteReader();
}
}
Run Code Online (Sandbox Code Playgroud)
调用代码确实关闭连接并适当地处理读取器和连接.
我的问题 - 在迭代读取器之前,是否可以将命令实例(通过使用块完成)放弃?关闭阅读器后,我不希望填充任何OUT参数.ADO.NET API是否有任何严格的准则?
我的属性绑定数据访问类有一个小问题(更像是一个烦恼)。问题是当读取器中不存在类中相应属性的列时,映射会失败。
这是映射器类:
// Map our datareader object to a strongly typed list
private static IList<T> Map<T>(DbDataReader dr) where T : new()
{
try
{
// initialize our returnable list
List<T> list = new List<T>();
// fire up the lamda mapping
var converter = new Converter<T>();
while (dr.Read())
{
// read in each row, and properly map it to our T object
var obj = converter.CreateItemFromRow(dr);
// add it to our list
list.Add(obj);
}
// reutrn it
return list;
} …Run Code Online (Sandbox Code Playgroud) c# reflection expression-trees dbdatareader linq-expressions
有谁知道DbDataReaders如何实际工作.我们可以使用SqlDataReader作为示例.
当您执行以下操作时
cmd.CommandText = "SELECT * FROM Customers";
var rdr = cmd.ExecuteReader();
while(rdr.Read())
{
//Do something
}
Run Code Online (Sandbox Code Playgroud)
数据读取器是否具有内存中的所有行,或者它只是抓取一个,然后当调用Read时,它是否会转到db并抓住下一个?似乎只是将一个内存带入内存将是糟糕的性能,但带来所有这些将使得它需要一段时间调用ExecuteReader.
我知道我是这个对象的消费者,并且实现它并不重要,但我只是好奇,我想我可能会花几个小时在Reflector中来了解它在做什么,所以我想问一个可能知道的人.
如果有人有想法,我只是好奇.
您好我试图从方法返回DataReader但它返回一个关闭的DbDataReader对象.任何想法来解决这个问题.我愿意接受任何使代码更好的建议.
谢谢
更新 我不想让数据库连接保持打开状态.是否有任何方法可以在关闭连接后返回打开的DataReader.
internal DbDataReader ExecuteReader(SqlCommand command, CommandBehavior behavior, string connectionString)
{
DbDataReader dataReader = null;
try
{
SqlConnection connection = GetConnection(connectionString);
Open(connection);
command.Connection = connection;
command.CommandTimeout = 60;
dataReader = command.ExecuteReader(behavior);
Close(connection);
}
catch
{
}
return dataReader;
}
Run Code Online (Sandbox Code Playgroud) 我正在批量执行一些SQL查询,然后批量获取所有结果集.我的代码当前放在一起的方式,第一个结果集被跳过.现在我知道了这一点,我可以简单地在我的循环之外引用另一个声明来获取第一个结果,但是我想知道是否有更优雅的解决方案来解决这个问题.
这里有一些sudo代码:
DbDataReader reader= /*some stuff that returns a batch of results...*/;
while (reader.NextResult())
{
while (reader.Read())
{
if (!reader.IsDBNull(0))
{
//do things with the data....
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在我原本期望NextResult()在你第一次调用它时将你带到第一个结果,这就是Read()似乎做的事情.然而它实际上似乎是在第一次通话时带你到第二个结果.我是否误解了您希望如何使用此方法,或者您是否真的希望执行以下操作:
DbDataReader reader= /*some stuff that returns a batch of results...*/;
//this deals with the row in the the very first result
while (reader.Read())
{
if (!reader.IsDBNull(0))
{
//do things with the data....
}
}
//this deals with the rest of the rows...
while (reader.NextResult())
{
while (reader.Read())
{
if (!reader.IsDBNull(0)) …Run Code Online (Sandbox Code Playgroud)