连接到 MSSQL DB 的问题

Posted

技术标签:

【中文标题】连接到 MSSQL DB 的问题【英文标题】:Trouble With Connecting to MSSQL DB 【发布时间】:2015-11-03 17:32:39 【问题描述】:

我有一个 Ubuntu 12.04 服务器,我正在尝试建立与 MSSQL 数据库的连接。

我已经设法使用tsqlisql 进行连接,但是osql 不起作用并且使用PDO 连接php 也不起作用.. 我会尽力提供尽可能多的信息如果您需要更多信息,请告诉我,我会进行编辑。

freetds.conf

[MSSQL]
  host = TPSACC
  port = 54488
  tds version = 8.0

odbc.ini

[MSSQL]
Description     = MS SQL connection to PRODUCTION database
Driver          = FreeTDS
Database        = PRODUCTION
Server          = TPSACC
UserName        = sa
Password        = pass
Trace           = No
TDS_Version     = 8.0
Port            = 54488

odbcinst.ini

[FreeTDS]
Description = ODBC for Microsoft SQL
Driver      = /usr/local/lib/libtdsodbc.so
UsageCount  = 1
Threading   = 2

~> isql MSSQL sa 通

+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> 

~> tsql -S MSSQL -U 'sa' -P 'pass'

locale is "en_US.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
1> 

~> osql -S MSSQL -U sa -P 通过

checking shared odbc libraries linked to isql for default directories...
strings: '': No such file
    trying /tmp/sql ... no
    trying /tmp/sql ... no
    trying /etc ... OK
checking odbc.ini files
    reading /home/toolplas/.odbc.ini
[MSSQL] not found in /home/toolplas/.odbc.ini
    reading /etc/odbc.ini
[MSSQL] found in /etc/odbc.ini
found this section:
    [MSSQL]
    Description     = MS SQL connection to PRODUCTION database
    Driver          = FreeTDS
    Database        = PRODUCTION
    Server          = TPSACC
    UserName        = sa
    Password        = pass
    Trace           = No
    TDS_Version     = 8.0
    Port            = 54488
looking for driver for DSN [MSSQL] in /etc/odbc.ini
  found driver line: "  Driver          = FreeTDS"
  driver "FreeTDS" found for [MSSQL] in odbc.ini
found driver named "FreeTDS"
"FreeTDS" is not an executable file
looking for entry named [FreeTDS] in /etc/odbcinst.ini
  found driver line: "  Driver      = /usr/local/lib/libtdsodbc.so"
  found driver /usr/local/lib/libtdsodbc.so for [FreeTDS] in odbcinst.ini
/usr/local/lib/libtdsodbc.so is an executable file
"Server" found, not using freetds.conf
Server is "TPSACC"
osql: no IP address found for "TPSACC"

在 PHP 中我有:

$conn = new PDO ("dblib:host=TPSACC;dbname=PRODUCTION","$username","$pw");

..或..

$conn = new PDO ("dblib:host=TPSACC;port=54488;dbname=PRODUCTION","$username","$pw");

他们都返回这个错误:

SQLSTATE[HY000] Unable to connect: Adaptive Server is unavailable or does not exist (severity 9) 

我在这里被困了几天,无法弄清楚为什么只有一半的连接真正有效..

非常感谢任何和所有帮助,谢谢!

编辑:这与那个问题不同,我在评论中解释过,但会在这里重新发布:

对于那个问题,问题是端口从 1433 更改了。我的也更改了,我修复了这个问题,端口现在是 54488,并且由于更改,tsql 和 isql 一直在工作。但是还是没有解决osql和PHP的问题。

【问题讨论】:

PHP error connecting to MS SQL database using PDO_DBLIB 的可能重复项 对于那个问题是端口从 1433 更改。我的也更改了,我修复了这个,端口现在是 54488,因为更改 tsql 和 isql 一直在工作。但是,它仍然没有解决 osql 和 PHP 的问题。 【参考方案1】:

osql 被您的配置中的某些东西窒息。 osql 是一个调试实用程序,它只检查您的配置,然后传递给 unixODBC 的 isql 进行连接 (http://linux.die.net/man/1/osql)。为您的 odbc.ini 试试这个:

[MSSQL]
Driver = FreeTDS
Description = MS SQL connection to PRODUCTION database
Server = tpsacc.yourfulldomain.com
Port = 54488
TDS_Version = 7.2
Database = PRODUCTION
UserName = sa
Password = pass
Trace = No

另外,您确定这是 libtdsodbc.so 的正确位置吗?当我使用 Ubuntu 14 x64 (utopic) 安装 freetds-dev 时,它会安装到 /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so;示例 odbcinst.ini:

[FreeTDS]
Description = v0.91 with protocol v7.2
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so

为了更好地衡量,我使用的典型 freetds.conf:

# A typical Microsoft server
[MSSQL]
host = tpsacc.yourfulldomain.com
port = 54488
tds version = 7.2

FreeTDS 最多仅支持大多数语言的 TDS 版本 7.2。虽然使用“8.0”不应该破坏任何东西,但使用 7.2 更好地保持一致性。如果您需要查看参考,我这里有一个完整配置的 Vagrant 框,示例:https://github.com/FlipperPA/django-python3-vagrant/Good lucky!

【讨论】:

您好,感谢您的回复!很抱歉,但我有点困惑..“tpsacc.domain.com”..我没有附加域,我只能使用 TPSACC IP 地址(10.0.1.2)。我还检查了你说的驱动程序的目录,驱动程序也在那里。所以我应该使用那个代替?即使它也在我之前的目录中? 当我将驱动程序更改为您告诉我的驱动程序时,我收到此错误/usr/lib/x86_64-lunix-gnu/odbc/libtdsodbc.so is not an executable file .. Wups,对不起,我并不是说你一定要改变路径——只是值得研究一下。你是如何安装 FreeTDS 的? 我没有实际使用 tpsacc.domain.com,而是使用了一个带有 FQDN(完全限定域名)的示例。您也可以尝试使用 IP 地址代替它。 我已经尝试了 IP 地址,但仍然没有成功。我只是好奇 freetds.conf / odbc.ini / odbcinst.ini 是否对 PDO 有影响?如果是这样,那么为什么需要在 PHP(主机、数据库、端口等)中再次声明所有内容?老实说,我很久以前(几个月)安装了 FreeTDS,我不记得具体是如何安装的,我只知道我无法让 ./configure && make 工作......你认为我更好吗关闭清除 freetds 并从头开始?

以上是关于连接到 MSSQL DB 的问题的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy 无法连接到 mssql 数据库

如何从 PHP 5.4 连接到 MS SQL 2000?

PHP PDO 连接到具有集成安全性的 SQL Server?

在没有 mssql 支持的情况下连接到 mssql

远程连接到 MSSQL,使用 Windows 身份验证,JAVA

django 模型创建连接到 mssql