2009-11-07 51 views
0

我有以下代码:DbDataReader自己关闭?

 var entityConnection = (System.Data.EntityClient.EntityConnection)c.Connection; 
     DbConnection conn = entityConnection.StoreConnection; 
     ConnectionState initialState = conn.State; 

     List<Jobs> list = new List<Jobs>(); 

     int id = 0; 
try 
     { 
      if (initialState != ConnectionState.Open) 
       conn.Open(); 

      using (DbCommand cmd = conn.CreateCommand()) 
      { 
       cmd.CommandText = sql; 
       reader = cmd.ExecuteReader(); 

       int count = 0; 

       while (reader.Read()) 
       { 
        id = int.Parse(reader[0].ToString()); 

        list.Add(db.Jobs.Where(x => x.JobId == id).First()); 
        //count++; 
        //if (count == 150) break; 

        reader.NextResult(); 
       } 
      } 
     } 

,我也得到一个错误说:“system.invalidoperationexception:无效试图调用NextResult当读取器已关闭”

但事情是我还没有关闭的读者,但是当我删除此行:

list.Add(db.Jobs.Where(x => x.JobId == id).First()); 

然后一切正常!但是这对我来说是无用的,因为我需要从阅读器填充一个列表对象,如果我不能这样做 - 那么我就无法读取表格了! (PS我避免SqlDataReader对象,并使用实体框架作出上述呼吁使用dbdatareader与我同它相关联)

+0

这是我的实体对象 - 但我删除此,而是试图使通用int类型的列表,然后做list.Add(ID);在那一行代替,但仍然有同样的问题:-s – David 2009-11-07 19:11:41

+0

任何人都可以帮忙吗? – David 2009-11-07 19:19:50

回答

6

您需要删除调用NextResult。此方法用于前进到下一个结果集,而不是下一个记录。在while循环的reader.Read()足够

+0

天哪你是个生命的救星,感谢ü这么多 – David 2009-11-07 19:30:38

3

你有没有尝试删除该行

reader.NextResult(); 

while (reader.Read())线要细阅读数据。

这就是我们如何使用它做的IDataReader。

+0

非常感谢你,你上面的那个人首先到达那里,只有公平的2给他作为答案,但是谢谢你太棒了! – David 2009-11-07 19:31:09

+0

好,astander其实我之前回答15秒) – 2009-11-07 19:38:58

+0

它的一切都很好,我们错过小东西有些时候,但许多眼睛里赶上什么一对小姐X-) – 2009-11-07 19:47:45

1

你在当Reader.Read循环调用NextResult - 这是令人困惑的。如果'sql'返回的结果只是一组记录,则NextResult将尝试查找要执行的一组SQL批次。如果您只想循环访问一组记录,则不需要使用顶部的Reader.Read循环。

SELECT 1 AS ID; 
SELECT 2 AS ID; 
SELECT 3 AS ID 

如果它只是一个基本的选择,它是行不通的:如果你的SQL包含多条语句,如只需要

NextResult。