2

我意识到没有办法以原子方式保证:

if(hasInternet)
    doDatabaseCall();

但是,在 .NET 世界中处理 DbConnection 和 DbCommand 对象时,处理连接问题的正确方法是什么? 我对 MySqlConnection 和 MySqlCommand 对象特别感兴趣,但假设(希望)它的异常模式与 SQL Server 的类相同。

我假设如果互联网在调用 conn.Open() 之前出现故障,则会引发 MySqlException。我还假设如果您调用 ExecuteReader 或 ExecuteNonQuery 并且互联网已经关闭,也会发生同样的情况。

我不确定,因为 MySql 对象的文档没有说。SqlServer 对象只是说它可能会引发 SqlException,这意味着:

对锁定的行执行命令时发生异常。当您使用 Microsoft .NET Framework 1.0 版时,不会生成此异常。

这似乎不包括连接问题......我想做的是处理异常,等待一段时间,然后重新开始。我的应用程序的唯一目的是执行这些数据库调用并在专用系统上运行,因此我认为永远重试确实是最好的选择。也就是说,我很想区分连接异常和其他类型的数据库异常,这可能吗?

我已经做了一些测试,它似乎像我想象的那样工作,但它在所有边缘情况下都有效吗? 如:命令已成功发送到数据库服务器,但在返回结果之前或期间连接断开?如果它不能在所有边缘情况下工作,那么我将不得不:执行一个命令,查询所需的状态更改,执行下一个命令,等等。每个命令都通过是很重要的。

我正在连接到 localhost 上的一个端口,该端口通过 SSH 转发到远程服务器,如果这有影响的话。

4

1 回答 1

1

至于 SqlDataProvider:

SqlException 异常有几个属性可以为您提供操作失败原因的详细信息。

对于您的用例,“类”属性可能是一个不错的选择。它是一个字节,指示异常的严重性。

请参阅:http: //msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlexception.class.aspx

如果这还不够具体,您可以检查 Errors 集合中的各个错误。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlexception.errors.aspx

根据该信息,您可以决定是否重试。

于 2010-10-03T13:54:03.097 回答