Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么不是';ODBCT连接。状态可靠吗?_C#_.net_Odbc - Fatal编程技术网

C# 为什么不是';ODBCT连接。状态可靠吗?

C# 为什么不是';ODBCT连接。状态可靠吗?,c#,.net,odbc,C#,.net,Odbc,考虑一个简单的设置: // _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)

考虑一个简单的设置:

// _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
-属性对此一无所知,并不断告诉我连接已打开,至少在我尝试执行命令之前(该命令正常失败)。我甚至遇到过这样的情况,
状态
-属性永远不会刷新,并且一直告诉我连接仍然存在(但命令失败)

当然,我可以在代码中添加
Try{…}Catch{…}
块,但我试图避免它们,因为扩展一个至少有四行错误处理的两行函数有点…沉重


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

网络的本质是,在你真正尝试发送数据之前,你通常不知道有问题。如果您只是简单地从计算机背面拔出插头(或者从客户机和服务器之间的某个交换机拔出插头),那么在操作系统实际尝试发送数据之前,它无法知道是否存在问题

因此,
状态
不可靠的原因是,如果不实际尝试向服务器发送数据,就不可能使其完全可靠。因为对于一个简单的属性来说(整个网络的往返)要做的工作太多了,所以它并没有做到这一点,只是尽可能做最简单的事情

另外,在调用
State==Open
和实际执行命令之间存在竞争条件:您可以调用
State==Open
,然后有人在执行命令之前拔掉插头


因此,在一天结束时,无论如何,您都必须拥有该异常处理程序。我还建议您不要将异常放在对数据库的每次调用上。如果你在做一个网站,那么就有一个页面级的处理程序,让它保持这个状态。除了向用户显示一条错误消息之外,尝试以任何其他方式“处理”一个数据库崩溃是毫无意义的…

网络的本质是,在您真正尝试发送数据之前,您通常不知道有问题。如果您只是简单地从计算机背面拔出插头(或者从客户机和服务器之间的某个交换机拔出插头),那么在操作系统实际尝试发送数据之前,它无法知道是否存在问题

因此,
状态
不可靠的原因是,如果不实际尝试向服务器发送数据,就不可能使其完全可靠。因为对于一个简单的属性来说(整个网络的往返)要做的工作太多了,所以它并没有做到这一点,只是尽可能做最简单的事情

另外,在调用
State==Open
和实际执行命令之间存在竞争条件:您可以调用
State==Open
,然后有人在执行命令之前拔掉插头


因此,在一天结束时,无论如何,您都必须拥有该异常处理程序。我还建议您不要将异常放在对数据库的每次调用上。如果你在做一个网站,那么就有一个页面级的处理程序,让它保持这个状态。除了向用户显示一条错误消息之外,尝试以任何其他方式“处理”一个数据库宕机是毫无意义的…

您所描述的竞争条件就是一个例子。您所描述的竞争条件就是一个例子。