pyodbc:如何测试是否可以与SQL服务器建立连接而不冻结

时间:2016-07-21 18:38:48

标签: python sql-server pyodbc

我正在编写一个wxPython的应用,其中包含pyodbc来访问SQL Server。用户必须先建立VPN连接,然后才能与SQL Server建立连接。如果用户忘记建立VPN连接或者根本无权访问特定服务器,则应用程序将在产生错误消息之前冻结最多60秒。通常,在弹出错误消息之前,用户会变得不耐烦并强制关闭应用程序。

我想知道是否有办法测试是否可以连接到服务器而不会冻结。我考虑使用timeout,但似乎{只有在我建立连接后才能使用{1}}

我使用的示例连接字符串如下:

timeout

2 个答案:

答案 0 :(得分:2)

请参阅timeout

下的https://code.google.com/archive/p/pyodbc/wikis/Connection.wiki
  

注意:此属性仅影响查询。设置超时   实际连接过程中,使用的是timeout关键字   pyodbc.connect函数。

因此,请将连接字符串更改为:

connection = pyodbc.connect(r'DRIVER={SQL Server};SERVER=ServerName;database=DatabaseName;Trusted_Connection=True;unicode_results=True', timeout=3) 

应该有效

答案 1 :(得分:1)

  

花了一段时间才发出关于服务器不存在或访问被拒绝的错误消息

您的评论会混淆两种截然不同的错误:

  • 服务器不存在是网络错误。名称没有地址,或者地址无法访问。无法建立联系。

  • 访问被拒绝是来自服务器的响应。要使服务器响应,必须存在连接。这不应与连接拒绝(ECONNREFUSED)混淆,这意味着远程不接受端口上的连接。

SQL Server使用TCP / IP。您可以使用standard network functions来确定是否可以找到运行SQL Server的计算机的网络主机名,以及是否可以访问该IP地址。使用它们“预先测试”连接的一个好处是,您将获得的任何错误将比典型的连接到服务器时出现问题更具体。

请注意,并非所有延迟诱导错误都可以避免。例如,如果DNS服务器没有响应,则解析器通常会在放弃之前等待30秒。如果IP地址有效,但没有具有该地址的计算机,则尝试连接将花费很长时间才能失败。客户无法知道没有这样的机器;可能需要很长时间才能得到答复。