我已经设置了PHP / ODBC / FreeTDS来将我的Ubuntu主机连接到远程MSSQL实例,这在技术上是有效的。我可以很好地执行简单的查询。但是,我不能使用准备好的陈述;产生以下错误:
警告:odbc_execute():SQL错误:[unixODBC] [Driver Manager]驱动程序 不支持此功能,SQL状态IM001中 SQLDescribeParameter ...
我猜这是因为正在使用早期的TDS版本(4.2),它不支持预处理语句和其他东西。麻烦的是,我似乎无法改变正在使用的TDS版本!我已经尝试了所有可以想到的配置......
运行tsql -C
会产生:
Compile-time settings (established with the "configure" script)
Version: freetds v0.91
freetds.conf directory: /etc/freetds
MS db-lib source compatibility: no
Sybase binary compatibility: yes
Thread safety: yes
iconv library: yes
TDS version: 4.2
iODBC: no
unixodbc: yes
SSPI "trusted" logins: no
Kerberos: yes
注意“TDS version: 4.2
”,尽管有以下配置。
ODBC.INI
[db_dsn]
Driver = FreeTDS
Servername = mssql_server
Database = my_database
Description = My MSSQL database.
Trace = No
ODBCINST.INI
[FreeTDS]
Description = TDS connection
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
UsageCount = 1
FileUsage = 1
freetds.conf
[global]
tds version = 7.2
text size = 64512
[mssql_server]
host = <IP>
port = 1433
tds version = 7.2
PHP
$connection = odbc_connect('db_dsn', $username, $password);
$statement = odbc_prepare($connection, "INSERT INTO my_table (col1, col2) VALUES (? ?)");
$exec = odbc_execute($statement, array($val1, $val2));
我尝试设置TDSVER
环境变量并运行tsql -C --with-tdsver=7.0
,但没有效果(甚至在tsql -C
输出中也没有)。我还尝试在TDS_Version
中为DSN指定匹配的odbc.ini
,并在Server
而不是Port
中使用odbc.ini
和Servername
来声明该内容在freetds.conf
。
这些更改似乎都没有改变我上面提到的报告的TDS版本或导致的SQL错误。我确信我正在freetds.conf
编辑正确的/etc/freetds
文件,我知道我的DSN有效,因为我可以执行简单的SELECT
语句等。
谁能告诉我我在俯瞰什么或者我在这里缺少什么?我确定这是一件小事,但我看不到它。
编辑#1: 已将配置的TDS版本从7.0更改为7.2。
编辑#2:
根据Flipper的评论,我将重复的Port
和TDS_Version
信息添加到我的odbc.ini
DSN以及freetds.conf
(无更改):
[db_dsn]
Driver = FreeTDS
Servername = mssql_server
Port = 1433
TDS_Version = 7.2
Database = my_database
Description = My MSSQL database.
Trace = No