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)但是调试模式无法返回正确数量的结果。
答案 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类。