DbDataReader自行关闭?

时间:2009-11-07 19:01:30

标签: c# sql-server ado.net

我有以下代码:

        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());

然后一切正常!但是这对我来说没用,因为我需要从阅读器填充一个列表对象,如果我不能这样做 - 那么我就无法读取该表了! (p.s我正在避免使用sqldatareader并使用dbdatareader,因为它与我联系使用实体框架进行上述调用)

3 个答案:

答案 0 :(得分:6)

您需要移除对NextResult的通话。此方法用于前进到下一个结果集,而不是下一个记录。你的while循环中的reader.Read()就足够了

答案 1 :(得分:3)

您是否尝试删除此行

reader.NextResult();

while (reader.Read())行应该可以用于读取数据。

这就是我们使用IDataReader的方式。

答案 2 :(得分:1)

你在While Reader.Read循环中调用NextResult - 这很令人困惑。如果'sql'返回的结果只是一组记录,那么NextResult将尝试查找要执行的一组SQL。如果您只想循环遍历一组记录,那么除了顶部的Reader.Read之外,您不需要任何其他内容。

仅当您的SQL包含多个语句时才需要NextResult,例如:

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

如果它只是一个基本的SELECT,它就无法运行。