我正在尝试使用unixODBC和FreeTDS从我的Mac连接到SQL Server 2005数据库,如我在此处所述.但是,当我尝试使用相同的设置连接到不同的数据库时,我得到:
Connection Failed:[FreeTDS][SQL Server]Unable to connect: Adaptive Server is unavailable or does not exist.
Run Code Online (Sandbox Code Playgroud)
这是我的freetds.conf设置:
[my_db]
host = 12.34.56.789
port = 1433
tds version = 8.0
Run Code Online (Sandbox Code Playgroud)
这是我的odbc.ini:
[my_dsn]
Driver = /opt/local/lib/libtdsodbc.so
Description = My Database
Trace = no
Servername = my_db
Database = MyDB
[ODBC Data Sources]
my_dsn = FreeTDS
Run Code Online (Sandbox Code Playgroud)
我仍然可以连接到我在这台计算机上设置的其他数据库(在我上面链接的博客文章中描述),所以我很确定错误不在Mac端.我已在服务器上验证我正在使用正确的IP地址和端口.关于什么可能是问题的任何想法,以及它是否在服务器端?
由于这个问题没有答案,我花了大部分时间来计算它,我想我会发布如何将FreeTDS 0.91交叉编译为iPhone ARMv6,ARMv7架构.这是使用Xcode 4.2和iOS 5 SDK完成的.
之所以要问这个问题,是因为您正在为需要连接到Mircosoft SQL Sever的iOS设备开发应用程序,这需要使用Tabular Data Stream(TDS)协议,因为它是Microsoft专有的.
我还要提到你需要一定程度的技术才能尝试这一点.这是我花了将近两个月才弄明白的一个非常简洁的版本(我留下了你不应该做的所有事情).
与此有关的其他文件:
基本如何使用FreeTDS http://www.freetds.org/userguide/samplecode.htm
Microsoft的TDS API文档 http://msdn.microsoft.com/en-us/library/aa936985(v=sql.80)
请参阅下面的答案.
另请参阅saskathex回答Xcode 4.5更新的文件.
以下作品:
import pyodbc
pyodbc.connect('DRIVER={FreeTDS};Server=my.db.server;Database=mydb;UID=myuser;PWD=mypwd;TDS_Version=8.0;Port=1433;')
Run Code Online (Sandbox Code Playgroud)
以下失败:
import sqlalchemy
sqlalchemy.create_engine("mssql://myuser:mypwd@my.db.server:1433/mydb?driver=FreeTDS& odbc_options='TDS_Version=8.0'").connect()
Run Code Online (Sandbox Code Playgroud)
上面的错误消息是:
DBAPIError :(错误)('08001','[08001] [unixODBC] [FreeTDS] [SQL Server]无法连接到数据源(0)(SQLDriverConnectW)')无无
有人可以指点我正确的方向吗?有没有办法告诉sqlalchemy将特定的连接字符串传递给pyodbc?
请注意:我希望保持此DSN-less.
我正在尝试使用FreeTDS和unixODBC从Ubuntu 12.04网络服务器连接到MSSQL服务器.
使用tsql我可以连接到服务器
~$ tsql -S dbs3 -U <username> -P <password>
Run Code Online (Sandbox Code Playgroud)
没问题.
当我尝试连接isql时,我收到以下错误消息:
~$ isql -v database3 <username> <password>
[S1000][unixODBC][FreeTDS][SQL Server]Unable to connect to data source
[01000][unixODBC][FreeTDS][SQL Server]Unknown host machine name.
[ISQL]ERROR: Could not SQLConnect
Run Code Online (Sandbox Code Playgroud)
我的配置文件如下:
ODBC.INI
[database3]
Driver=FreeTDS
TDS_Version=8.0
Servername=dbs3
Port=1433
Database=benchmark_res
Run Code Online (Sandbox Code Playgroud)
ODBCINST.INI
[FreeTDS]
Description=FreeTDS v0.91
Driver=/usr/local/lib/libtdsodbc.so
Setup=/usr/local/lib/libtdsS.so
Trace=Yes
TraceFile=/tmp/freetds.log
ForceTrave=Yes
UsageCount=1
Run Code Online (Sandbox Code Playgroud)
freetds.conf
# This file is installed by FreeTDS if no file by the same
# name is found in the installation directory.
#
# For information about …
Run Code Online (Sandbox Code Playgroud) 当您使用PDO
与MSSQL的驱动程序,你实际使用freetds的低级别的驱动程序.执行存储过程有一些不同的方法 - 语言查询和RPC调用.
FreeTDS还支持TDS协议版本4.2和7.x. 它们之间的主要区别之一是存储过程调用的行为.Microsoft将协议4.2中的行为更改为7.0,而不是从语言查询返回输出参数.语言查询主要将文本查询发送到包装到TDS包中的服务器.
$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");
$value = 'Hello!';
$stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000);
$stmt->execute();
print "The output is $value\n";
Run Code Online (Sandbox Code Playgroud)
实际上你发送的东西就像"EXEC sp_takes ....".如果您使用MSSQL运行上面的示例,您将获得TDS7.х中的空输出参数和4.2的预期结果.为什么我们不能使用4.2并且开心?它有很多局限性:
prepared statements
不支持动态查询(也称为).所以,4.2不是变种.
$stmt = mssql_init('sp_takes_string_returns_string');
$value = 'Hello!';
mssql_bind($stmt, 1, $value, SQLVARCHAR, true, false, 4000);
mssql_execute($stmt);
print "The output is $value\n";
Run Code Online (Sandbox Code Playgroud)
使用上面的示例和php中的本机mssql扩展,您可以使用TDS 7.2获得正确的结果.实际上,您使用该代码发送二进制RPC数据包.
是否有任何方法可以使用PDO和MSSQL驱动程序对存储过程进行RPC调用?
我似乎无法使用FreeTDS扩展从MSSQL编码为UTF-8的数据.
连接:
ini_set('mssql.charset', 'UTF-8');
$this->_resource = mssql_connect($config['servername'], $config['username'], $config['password']);
Run Code Online (Sandbox Code Playgroud)
我无法使用任何其他扩展程序.
我试过创建〜/ .freetds.conf
[global]
client charset = UTF-8
Run Code Online (Sandbox Code Playgroud)
我已经尝试将参数传递给php:
php -d mssql.charset="UTF-8" index.php
Run Code Online (Sandbox Code Playgroud)
数据仍然不是UTF-8.
php -i
mssql
MSSQL Support => enabled
Active Persistent Links => 0
Active Links => 0
Library version => FreeTDS
Directive => Local Value => Master Value
mssql.allow_persistent => On => On
mssql.batchsize => 0 => 0
mssql.charset => no value => no value
mssql.compatability_mode => Off => Off
mssql.connect_timeout => 5 => 5
mssql.datetimeconvert => On …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Mac上的Pypyodbc连接到SQL Server,我收到以下错误:
pypyodbc.DatabaseError: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'FreeTDS' : file not found")
Run Code Online (Sandbox Code Playgroud)
我已经安装了freeTDS和unixodbc
brew install unixodbc
brew install freetds
Run Code Online (Sandbox Code Playgroud)
这是我的连接字符串与虚拟数据:
connection_String = "Driver=FreeTDS;Server=123.12.12.12;tds_version=7.2;Database=db_db;Uid=username:pwd=password:port=1433"
Run Code Online (Sandbox Code Playgroud) 我决定使用FreeTDS驱动程序和unixODBC来管理基于LAMP的应用程序与远程MsSQL数据库之间的PDO连接.不幸的是,驱动程序似乎没有读取freetds.conf文件,也没有直接通过服务器的CLI设置或通过putenv()函数在php文件中指定的环境变量.
现在一些数据:
因为我使用命令
TDSVER=7.0 tsql -H >IP< -p 1433 -U username
Run Code Online (Sandbox Code Playgroud)
系统提示我输入密码并建立连接.
没有命令前面的TDSVER - 连接失败并显示以下消息:
Error 20017 (severity 9):
Unexpected EOF from the server
OS error 115, "Operation now in progress"
Error 20002 (severity 9):
Adaptive Server connection failed
There was a problem connecting to the server
Run Code Online (Sandbox Code Playgroud)tsql -C命令回声这样的输出:
Compile-time settings (established with the "configure" script)
Version: freetds v0.91
freetds.conf directory: /usr/local/etc
MS db-lib source compatibility: yes
Sybase binary compatibility: no
Thread safety: yes …
Run Code Online (Sandbox Code Playgroud)在Linux机器上,我使用PDO DBLIB连接到MSSQL数据库并在SQL_Latin1_General_CP1_CI_AS
表中插入数据.问题是,当我尝试插入中文字符(多字节)时,它们被插入为哈市香åŠåŒºç 江路å·
.
我的(部分)代码如下:
$DBH = new PDO("dblib:host=$myServer;dbname=$myDB;", $myUser, $myPass);
$query = "
INSERT INTO UserSignUpInfo
(FirstName)
VALUES
(:firstname)";
$STH = $DBH->prepare($query);
$STH->bindParam(':firstname', $firstname);
Run Code Online (Sandbox Code Playgroud)
到目前为止我尝试过的:
这样做mb_convert_encoding
对UTF-16LE
的$firstname
和CAST作为VARBINARY像查询:
$firstname = mb_convert_encoding($firstname, 'UTF-16LE', 'UTF-8');
VALUES
(CAST(:firstname AS VARBINARY));
Run Code Online (Sandbox Code Playgroud)
这导致正确插入字符,直到有一些非多字节字符,这会破坏PDO执行.
将我的连接设置为utf8:
$DBH = new PDO("dblib:host=$myServer;dbname=$myDB;charset=UTF-8;", $myUser, $myPass);
$DBH->exec('SET CHARACTER SET utf8');
$DBH->query("SET NAMES utf8");
Run Code Online (Sandbox Code Playgroud)client charset
在我的freetds.conf中设置为UTF-8
哪个没有影响.
有没有办法在该SQL数据库中插入多字节数据?还有其他解决方法吗?我曾经想过尝试PDO ODBC甚至是mssql,但是在浪费时间之前最好先问一下这个问题.
提前致谢.
编辑:
我最终使用MSSQL和N
数据类型前缀.当我有更多时间时,我会换掉并尝试PDO_ODBC.谢谢大家的答案!
我在Debian Lenny(5.0.7)上成功使用pyodbc时遇到了一些麻烦.具体来说,我似乎无法获取NVARCHAR值(不是SQL Server专家,所以对我很容易:)).
大多数传统查询都可以.例如,table1中的行数产生
cursor.execute("SELECT count(id) from table1")
<pyodbc.Cursor object at 0xb7b9b170>
>>> cursor.fetchall()
[(27, )]
Run Code Online (Sandbox Code Playgroud)
就像完全转储ID一样
>>> cursor.execute("SELECT id FROM table1")
<pyodbc.Cursor object at 0xb7b9b170>
>>> cursor.fetchall()
[(0.0, ), (3.0, ), (4.0, ), (5.0, ), (6.0, ), (7.0, ), (8.0, ), (11.0, ), (12.0, ), (18.0, ), (19.0, ), (20.0, ), (21.0, ), (22.0, ), (23.0, ), (24.0, ), (25.0, ), (26.0, ), (27.0, ), (28.0, ), (29.0, ), (32.0, ), (33.0, ), (34.0, ), (35.0, ), (36.0, ), …
Run Code Online (Sandbox Code Playgroud) freetds ×10
sql-server ×8
php ×3
pdo ×2
pyodbc ×2
python ×2
unixodbc ×2
ios ×1
iphone ×1
isql ×1
linux ×1
macos ×1
multibyte ×1
odbc ×1
pypyodbc ×1
sqlalchemy ×1
ubuntu-10.04 ×1
ubuntu-12.04 ×1
utf-8 ×1
xcode4.2 ×1