为什么不是ODBCConnection.State可靠?

问题描述:

考虑一个简单的设置:为什么不是ODBCConnection.State可靠?

// _conn is the OdbcConnection with a MySQL-Server (MySQL-Connector 3.51) 
// _cmd is a created OdbcCommand 

// Constructor has created the objects successfully 

public void DoSomething() { 
    if(_conn.State == ConnectionState.Open) 
     _cmd.ExecuteNonQuery(); 
} 

现在我的问题是,OdbcConnection.State是不可靠的。事情是,一段时间后连接丢失,但State - 属性不知道任何关于它,并不断告诉我,连接是打开的,至少直到我尝试执行一个命令(它优雅地失败) 。我甚至遇到了State - 属性永远不会刷新,并一直告诉我,连接仍然存在(但命令失败)。

当然,我可以将Try {...} Catch {...}块添加到我的代码中,但我试图避免它们,因为使用至少四行错误处理扩展双行功能有点重。

所以我的问题是:为什么不是OdbcConnection.State可靠,我可以修复它?

网络的本质是,除非实际尝试发送数据,否则您通常不知道存在问题。如果您只是将插头从计算机背面拔出(或者将插头从客户端和服务器之间的某个位置拔出),则在操作系统实际尝试发送数据之前无法知道操作系统甚至有一个问题。

的原因的话,那State是不可靠的,是因为它不可能使是完全可靠的,而不实际实际上是试图将数据发送到服务器。由于这对于一个简单的属性来说太过于工作(整个网络往返),所以它不会这么做,而只是做最简单的事情。

另外,当您拨打State == Open和实际执行命令之间存在竞争状态:您可能会调用State == Open,然后在执行命令之前有人拉动插头。

因此,在一天结束时,您将不得不拥有该异常处理程序。我还建议你不要在每次调用数据库时都抛出异常。如果你正在做一个网站,然后有一个页面级处理程序,并在那。尝试“处理”数据库以任何其他方式进行,而不是通过向用户显示错误消息来确实没有意义...