C# SqlDataReader 发布配置文件提前关闭 dataReader(错误)

C# SqlDataReader release profile closing dataReader early (Error)

SqlCommand myCommand = new SqlCommand(command, myConnection);
using (SqlDataReader myReader = myCommand.ExecuteReader())
{
    while (myReader.Read())
    {
        Item item = new Item();
        try { cost = double.Parse(myReader["Cost"].ToString()); } catch { /* logging */ }
        item.Cost = cost;
        list.Add(item);
    }
}

return list;

我有上面的代码,当 运行 在 Debug 模式下它执行完美,但是当我切换 visual studio 到 Release profile 时,它​​只有 return 一个大约 500 项的列表,当它应该是那个的 3-4 倍时。

我的 SQLClass 在创建 class 时创建并打开一个新的 SqlConnection (myConnection),并在析构函数中处理它。

我在其他地方找不到此类行为的参考资料,但它在调试中完美运行。我在它周围有 catch 语句来尝试捕获错误,它偶尔会抛出 'sqlDataReader closed' 错误,但大多数时候它甚至不会抛出错误。确实很难复制错误,但是在 b运行d 新项目中发布时,它仍然 return 是一个不正确的数据集列表。

我已经用问题代码复制了创建 b运行d 新 class 库的错误。在发布模式下构建 dll 会产生零问题。如果我 运行 调试中的测试控制台应用程序,它工作正常(即使使用从发布模式编译的 dll)但是调试模式无法 return 正确数量的结果。

将评论中的评论放在一起,我想出了代码,您应该尝试一下:

int cost = 0;
Item item;
while (myReader.Read())
{
    double.TryParse(myReader["Cost"].ToString(), out cost);
    item = new Item(){Cost = cost};
    list.Add(item);
}

感谢大家的建议

原来在 while(myReader.Read()) 仍在执行时调用了 class 析构函数方法,这导致它出错或只有 return 一半数据,在连接被析构函数强行关闭之前。 Release candidate 的代码优化一定意味着玻璃在 reader 完成之前就被处理掉了。

通过删除

修复了它
    ~SqlClass()
    {
       myConnection.Close(); // This was causing all the issues.
    }

来自析构函数 class,它解决了问题。现在只靠GC清理SqlConnectionclass。