使用 PDO 连接到 Sybase 的正确 DSN

Posted

技术标签:

【中文标题】使用 PDO 连接到 Sybase 的正确 DSN【英文标题】:Proper DSN to connect to Sybase using PDO 【发布时间】:2014-05-21 02:20:09 【问题描述】:

我正在尝试使用 php 的 PDO 连接到 Sybase (SQL Anywhere 12) 数据库。我花了几个小时试图找到正确的驱动程序和 DSN 来使用,但完全没有成功。每次我尝试编辑单个参数时,我总是会出错。我尝试了数十种不同的 DSN 参数组合,但没有任何反应。我将在这里只报告一些,只是为了给您举例说明我正在尝试获得的内容。

我成功安装了 PDO 驱动程序 - 来自 php.ini:

PDO drivers     dblib, mysql, odbc, pgsql 

PDO Driver for FreeTDS/Sybase DB-lib        enabled
Flavour                                     freetds 

数据库参数:

数据库的 IP 是 192.168.100.234,数据库实例和数据库名称都是 GAMMA01。我不能告诉你用户名和密码,但是让我们说:用户 dba 和 pwd 好吧。 我可以从我尝试启动连接的服务器 ping 服务器。

我在 Linux Debian Squeeze 和 PHP 5.3.3 下。

DBLIB:

我找不到正确的 DSN 来连接到我的数据库服务器。

DSN 版本 1:

'dblib:host=192.168.100.234;DBN=GAMMA01'

DSN 版本 2:

'dblib:host=192.168.100.234;DBN=GAMMA01;UID=dba;PWD=allright;Server=GAMMA01;ASTART=No'

DSN 版本 3:

new PDO('dblib:host=192.168.100.234;dbname=GAMMA01', 'dba', 'allright');

我收到错误

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

FreeTDS 错误日志(尝试使用 5.0 和 7.0 版本,没有区别):

log.c:190:Starting log file for FreeTDS 0.82
        on 2014-04-08 13:40:40 with debug flags 0x4fff.
iconv.c:363:iconv to convert client-side data to the "ANSI_X3.4-1968" character set
iconv.c:516:tds_iconv_info_init: converting "US-ASCII"->"UCS-2LE"
iconv.c:516:tds_iconv_info_init: converting "ISO-8859-1"->"UCS-2LE"
net.c:210:Connecting to 192.168.100.234 port 5200 (TDS version 7.0)
net.c:264:tds_open_socket: connect(2) returned "Operation now in progress"
net.c:299:getsockopt(2) reported: Connection refused
util.c:334:tdserror(0xb9a46eb0, 0xb9b60688, 20009, 115)
dblib.c:7782:dbperror(0xb9b5ff88, 20009, 115)
dblib.c:7835:20009: "Unable to connect: Adaptive Server is unavailable or does not exist"
dblib.c:5627:dbgetuserdata(0xb9b5ff88)
dblib.c:7856:"Unable to connect: Adaptive Server is unavailable or does not exist", client returns 2 (INT_CANCEL)
util.c:368:tdserror: client library returned TDS_INT_CANCEL(2)
util.c:389:tdserror: returning TDS_INT_CANCEL(2)
net.c:310:tds_open_socket() failed
dblib.c:1372:dbclose(0xb9b5ff88)
dblib.c:256:dblib_del_connection(0xb5ceea00, 0xb9b60688)
mem.c:563:tds_free_all_results()
dblib.c:303:dblib_release_tds_ctx(1)
dblib.c:5727:dbfreebuf(0xb9b5ff88)
dblib.c:718:dbloginfree(0xb9b46588)

使用 sybase: DSN:

'sybase:host=192.168.100.234;dbname=GAMMA01, dba, allright'

错误:

could not find driver

ODBC: 我无法连接 ODBC 驱动程序。我在这里阅读了指南:http://www.sybase.com/files/White_Papers/PHP_SQL_Anywhere.pdf 并在此处下载了正确的 .so 包:http://scn.sap.com/docs/DOC-40537 但我无法让 PHP 识别该包,加载并使用它。

DSN:

'odbc:Driver=Sybase SQL Anywhere 12;NA=192.168.100.234,5200;Uid=dba;Pwd=allright;'
'odbc:Driver=SQL Anywhere 12;NA=192.168.100.234,5200;Uid=dba;Pwd=allright;'
'odbc:DRIVER=Sybase SQL Anywhere 12;SRVR=192.168.100.234;DB=gamma01;UID=dba;PWD=allright;'
'odbc:DRIVER=Sybase SQL Anywhere 12;HOSTNAME=192.168.100.234;DATABASE=gamma01;UID=dba;PWD=allright;PROTOCOL:TCPIP'

我得到的错误:

SQLSTATE[IM002] SQLDriverConnect: 0 [unixODBC][Driver Manager]Data source name not found, and no default driver specified

我应该使用哪个驱动程序连接到 Sybase db?哪个是正确的 DSN?

【问题讨论】:

我很确定需要包含端口,无论您使用哪个 DSN(最后两个 DSN 条目不包含它) 如果我指定端口(5200),问题总是一样的。 【参考方案1】:

"Data source name not found and no default driver specified." 错误意味着在您的 ODBC 环境的 odbc.ini 文件中找不到您指定的 DSN 或驱动程序。

您需要确保您的 ODBC 环境设置正确。通常,这包括 odbc.ini 文件的位置和文件名的规范。

在尝试连接时,将搜索 odbc.ini 文件以找到匹配的数据源名称 (DSN)

在您的情况下,您指定的是“驱动程序”。这是 odbcinst.ini 文件中常见的类似配置;也由您的 ODBC 环境指定。

要检查的另一件事是确保正在运行的进程或 PHP 应用程序的拥有用户找到了 ODBC 环境。

关键是要弄清楚连接序列的哪一部分失败了。在您的情况下,成功的连接将遵循以下路径:

    应用程序已启动 正在尝试 ODBC 连接 搜索 ODBC 环境以查找配置文件(通常是 odbcinst.ini 用于“驱动程序”配置) 在连接字符串中查找为“Driver=”指定的值的匹配项 尝试使用找到的驱动程序部分中配置的值以及连接字符串中提供的其他选项进行连接。

导致您遇到错误的两个主要因素是:

    未配置 ODBC 环境 DSN 或 Driver 值拼写不正确。

我希望这会有所帮助。

托尼·霍尔

【讨论】:

以上是关于使用 PDO 连接到 Sybase 的正确 DSN的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中通过 ODBC(使用 PDO)查询雪花返回不正确的数据

PDO 返回错误“找不到驱动程序”和已知的工作 DSN

为啥 PHP PDO DSN 是 MySQL 与 PostgreSQL 不同的格式?

PDO相关函数

将 PHP 连接到 UniVerse ODBC DSN

PDO 找不到 ODBC 驱动程序