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

时间:2017-12-27 09:52:03

标签: c# .net visual-studio sqldatareader

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;

我有上面的代码,当在调试模式下运行它完美执行时,但是当我将visual studio切换到Release配置文件时,它只返回大约500个项目的列表,当它应该是3-4x时。

我的SQLClass在创建类时创建并打开一个新的SqlConnection(myConnection),并将其置于析构函数中。

我在其他地方找不到这种行为的引用,但它在Debug中完美无缺。我已经捕获它周围的语句来尝试捕获错误,它偶尔会抛出'sqlDataReader关闭'错误,但大多数时候它甚至不会抛出错误。真的很难复制,但是在一个全新项目的发布中,它仍然会返回一个小于正确数据集的列表。

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

感谢大家的建议。

当析构函数强制关闭连接之前,while(myReader.Read())仍在执行时导致类析构函数方法被调用,导致它出错或仅返回一半数据。候选版本的代码优化必须意味着在阅读器完成之前处理玻璃。

通过删除

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

从析构函数类中解决了问题。现在只需依靠GC来清理SqlConnection类。