我正在编写一个wxPython
的应用,其中包含pyodbc
来访问SQL Server。用户必须先建立VPN连接,然后才能与SQL Server建立连接。如果用户忘记建立VPN连接或者根本无权访问特定服务器,则应用程序将在产生错误消息之前冻结最多60秒。通常,在弹出错误消息之前,用户会变得不耐烦并强制关闭应用程序。
我想知道是否有办法测试是否可以连接到服务器而不会冻结。我考虑使用timeout
,但似乎{只有在我建立连接后才能使用{1}}
我使用的示例连接字符串如下:
timeout
答案 0 :(得分:2)
请参阅timeout
注意:此属性仅影响查询。设置超时 实际连接过程中,使用的是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地址有效,但没有具有该地址的计算机,则尝试连接将花费很长时间才能失败。客户无法知道没有这样的机器;可能需要很长时间才能得到答复。