本文介绍了为什么我成功读取的 Npgsql 数据消失了?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有以下代码形状.似乎我误解了 C# 方法的返回值.一个完整"的枚举器怎么可能作为一个空的枚举器返回?
I have the following code shape. It seems that I'm misunderstanding the C# method return values. How is it possible that a "full" enumerator gets returned as an empty one?
class ThingDoer { public NpgsqlDataReader DoQuery() { NpgsqlCommand c = new NpgsqlCommand(...); NpgsqlDataReader dataread = c.ExecuteReader(); return dataread; // Debugger confirms that six data are enumerable here. } } ... class OtherThing { public void higherLevelFunction() { NpgsqlDataReader result = myThingDoer.DoQuery(); result.Read(); // No data! result's enumerable returns nothing! } } 推荐答案你没有详细说明你的连接来自哪里.假设它是这样的:
You don't detail where your connection is coming from. Assuming it's something like:
public NpgsqlDataReader DoQuery() { using(NpgsqlConnection = GetConnectionCode()) { NpgsqlCommand c = new NpgsqlCommand(...); NpgsqlDataReader dataread = c.ExecuteReader(); return dataread; }//Connection closes at this using-scope being left because that triggers Dispose() }然后将其更改为:
public NpgsqlDataReader DoQuery() { bool ownershipPassed = false; NpgsqlConnection conn = GetConnectionCode(); try { NpgsqlCommand c = new NpgsqlCommand(...); NpgsqlDataReader dataread = c.ExecuteReader(CommandBehavior.CloseConnection); ownershipPassed = true; return dataread; } finally { if(!ownershipPassed)//only if we didn't create the reader than takes charge of the connection conn.Dispose(); } }那么在你使用reader的地方,你必须要处置它来依次处置连接的底层连接到数据库:
Then where you use the reader, you have to dispose it to in turn dispose the connection's underlying connection to the database:
public void higherLevelFunction() { using(NpgsqlDataReader result = myThingDoer.DoQuery()) result.Read(); }更多推荐
为什么我成功读取的 Npgsql 数据消失了?
发布评论