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。
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。