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

问题描述 投票:0回答:2
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关闭'错误,但大多数时候它甚至不会抛出错误。真的很难复制,但是在一个全新项目的发布中,它仍然会返回一个不正确的数据集列表。

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

c# .net visual-studio sqldatareader
2个回答
0
投票

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

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

0
投票

感谢大家的建议。

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

通过删除它来修复它

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

从析构函数类,它修复了问题。现在只需依靠GC来清理SqlConnection类。

© www.soinside.com 2019 - 2024. All rights reserved.