客户端pyodbc错误:“服务器不存在或访问被拒绝。”

时间:2015-08-11 21:35:08

标签: python sql-server pyodbc

我有一个python应用程序,用于使用pyodbc从远程数据库服务器提取数据,然后在电子表格中组织和显示数据。我已经好几个月了,我的部门有多个同事通过共享网络文件夹使用它。

我的联系:

pyodbc.connect('DRIVER={SQL Server};
                SERVER=<myServer_name>;
                DATABASE=<myDB_name>;
                UID=personsUser;
                PWD=personsPassword')

我们同一网络中的另一名员工最近尝试使用该程序并收到此错误:

pyodbc.Error: ('08001','[08001][Microsoft][ODBC SQL Server Driver]
[DBNETLIB]SQL Server does not exist or access denied. (17) (SQLDriverConnect)')

它看起来像是一个简单的权限问题,所以要确认我用自己的硬编码替换了用户ID和密码,但它给出了同样的错误。此外,同一个员工可以通过SQL Server Management Studio登录并执行查询而不会出现问题。

由于我们部门的其他人仍然可以正常使用该应用程序,我知道它必须是客户端问题,但我无法确定问题所在。任何意见都将非常感谢,谢谢!

更新

根据下面的每个flipperPA的答案,我更新了我的连接字符串以包含端口:

con = pyodbc.connect('''DRIVER={SQL Server};
                        SERVER=<myServer_name>;
                        PORT=1433;
                        DATABASE=<myDB_name>;
                        UID=personsUser;
                        PWD=personsPassword;''')

不幸的是我们仍然遇到了同样的错误。

他在HP机器上运行32位Windows 7,设置与该组的其他部分相同,因此它不应该是操作系统级别的问题。

他确实在同一台机器上运行SSMS,但我确实通过telnet检查 - 没问题。

我自学了pyodbc API和基本SQL,但我对数据库和远程连接的基本概念还是比较新的。你能解释一下TDS驱动程序吗?

2 个答案:

答案 0 :(得分:2)

当包括SERVER时,我发现你经常需要包括PORT;这是最可能的问题:

pyodbc.connect('DRIVER={SQL Server};
                SERVER=<myServer_name>;
                PORT=1433;
                DATABASE=<myDB_name>;
                UID=personsUser;
                PWD=personsPassword')

然而,我主要是从Linux连接。可能是其他人从Mac OS / X或Linux连接?如果是这样,他们将需要使用FreeTDS驱动程序(MS也提供一个驱动程序,但它最好是片状的)。如果您从同事机器继续遇到问题,请确保您可以从遇到问题的机器连接(除非它可以连接SSMS的同一台机器):

telnet <myServer_name> 1433

如果它连接起来,那么你很好,如果它在连接时挂起,你很可能会查看防火墙问题。祝你好运!

答案 1 :(得分:1)

在与知识渊博的朋友交谈后,我终于能够找出问题所在!

由于某种原因,用户的系统配置为使用命名管道进行连接,但我连接的服务器仅启用了TCP / IP协议。解决方案是通过在服务器名称的前面添加“tcp:”来强制应用程序使用TCP / IP。

固定连接字符串:

pyodbc.connect('''DRIVER={SQL Server};
                  SERVER=tcp:<myServer_name>;
                  PORT=1433;
                  DATABASE=<myDB_name>;
                  UID=personsUser;
                  PWD=personsPassword
               ''')