2013-07-08 86 views
0

我已经使用Homebrew安装了freetds。我的配置如下:在Mac OS X上无法使用isql连接到SQL Server

odbcinst -j:

unixODBC 2.3.1
DRIVERS............: /usr/local/Cellar/unixodbc/2.3.1/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/Cellar/unixodbc/2.3.1/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/Cellar/unixodbc/2.3.1/etc/ODBCDataSources
USER DATA SOURCES..: /Users/mark.richman/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

/usr/local/Cellar/unixodbc/2.3.1/etc/odbcinst.ini:

[ODBC]
Trace = Yes
TraceFile = /tmp/odbc.log

/usr/local/Cellar/freetds/0.91/etc/freetds.conf:

[db.mydomain.local]
host = db.mydomain.local
port = 1433
tds version = 8.0
client charset = UTF-8

~/.odbc.ini:

[MomImporterDSN]
Description = Mom Importer
Driver = /usr/local/Cellar/freetds/0.91/lib/libtdsodbc.so
Servername = db.mydomain.local
Database = MomImporter
UserName = mark.richman
Password = mypassword

当我尝试isql -v MomImporterDSN我得到以下错误:

[S1000][unixODBC][FreeTDS][SQL Server]Unable to connect to data source
[01000][unixODBC][FreeTDS][SQL Server]Adaptive Server connection failed
[ISQL]ERROR: Could not SQLConnect

/tmp/odbc.log似乎并不特别有用:

[ODBC][14514][1373290079.248688][__handles.c][460] 
     Exit:[SQL_SUCCESS] 
      Environment = 0x7fcbe1004c00 
[ODBC][14514][1373290079.249314][SQLAllocHandle.c][375] 
     Entry: 
      Handle Type = 2 
      Input Handle = 0x7fcbe1004c00 
[ODBC][14514][1373290079.249470][SQLAllocHandle.c][493] 
     Exit:[SQL_SUCCESS] 
      Output Handle = 0x7fcbe1024800 
[ODBC][14514][1373290079.249712][SQLConnect.c][3700] 
     Entry: 
      Connection = 0x7fcbe1024800 
      Server Name = [MOMImporterDSN][length = 14 (SQL_NTS)] 
      User Name = [NULL] 
      Authentication = [NULL] 
     UNICODE Using encoding ASCII 'char' and UNICODE 'UCS-2-INTERNAL' 

     DIAG [01000] [FreeTDS][SQL Server]Adaptive Server connection failed 

     DIAG [S1000] [FreeTDS][SQL Server]Unable to connect to data source 

[ODBC][14514][1373290079.703504][SQLConnect.c][4067] 
     Exit:[SQL_ERROR] 
[ODBC][14514][1373290079.704257][SQLError.c][434] 
     Entry: 
      Connection = 0x7fcbe1024800 
      SQLState = 0x7fff5a823526 
      Native = 0x7fff5a823520 
      Message Text = 0x7fff5a823530 
      Buffer Length = 500 
      Text Len Ptr = 0x7fff5a82351e 
[ODBC][14514][1373290079.704559][SQLError.c][471] 
     Exit:[SQL_SUCCESS] 
      SQLState = S1000 
      Native = 0x7fff5a823520 -> 0 
      Message Text = [[unixODBC][FreeTDS][SQL Server]Unable to connect to data source] 
[ODBC][14514][1373290079.704777][SQLError.c][434] 
     Entry: 
      Connection = 0x7fcbe1024800 
      SQLState = 0x7fff5a823526 
      Native = 0x7fff5a823520 
      Message Text = 0x7fff5a823530 
      Buffer Length = 500 
      Text Len Ptr = 0x7fff5a82351e 
[ODBC][14514][1373290079.704996][SQLError.c][471] 
     Exit:[SQL_SUCCESS] 
      SQLState = 01000 
      Native = 0x7fff5a823520 -> 20002 
      Message Text = [[unixODBC][FreeTDS][SQL Server]Adaptive Server connection failed] 
[ODBC][14514][1373290079.705172][SQLError.c][434] 
     Entry: 
      Connection = 0x7fcbe1024800 
      SQLState = 0x7fff5a823526 
      Native = 0x7fff5a823520 
      Message Text = 0x7fff5a823530 
      Buffer Length = 500 
      Text Len Ptr = 0x7fff5a82351e 
[ODBC][14514][1373290079.705357][SQLError.c][471] 
     Exit:[SQL_NO_DATA] 
[ODBC][14514][1373290079.705583][SQLError.c][514] 
     Entry: 
      Environment = 0x7fcbe1004c00 
      SQLState = 0x7fff5a823526 
      Native = 0x7fff5a823520 
      Message Text = 0x7fff5a823530 
      Buffer Length = 500 
      Text Len Ptr = 0x7fff5a82351e 
[ODBC][14514][1373290079.705763][SQLError.c][551] 
     Exit:[SQL_NO_DATA] 
[ODBC][14514][1373290079.706061][SQLFreeHandle.c][284] 
     Entry: 
      Handle Type = 2 
      Input Handle = 0x7fcbe1024800 
[ODBC][14514][1373290079.706195][SQLFreeHandle.c][333] 
     Exit:[SQL_SUCCESS] 
[ODBC][14514][1373290079.706415][SQLFreeHandle.c][219] 
     Entry: 
      Handle Type = 1 
      Input Handle = 0x7fcbe1004c00 

我使用山狮10 .8.4,unixodbc 2.3.1,freetds 0.91和SQL Server 2008.

谢谢!

回答

0

您可以通过指定ODBC的TDS版本设置

[MomImporterDSN] 
Description = Mom Importer 
Driver = /usr/local/Cellar/freetds/0.91/lib/libtdsodbc.so 
TDS_Version = 8.0 
Servername = db.mydomain.local 
Database = MomImporter 
UserName = mark.richman 
Password = mypassword 
+0

为什么我需要提供那些在〜/ .odbc.ini中指定的? –

+0

@MarkRichman你能看到我更新的答案 – meda

1

按照https://github.com/mkleehammer/pyodbc/wiki/Connecting-to-SQL-Server-from-Mac-OSX

但是发出的所有指示修正此错误,还有一些额外的步骤和黑客如果ISQL/OSQL不工作(假设tsql工作正常)。他们听起来很奇怪,但解决了这个问题(isql/osql没有连接,虽然tsql工作正常)。

下面列出的每个步骤都是调试osql错误消息的结果。

在一个或多个步骤中,您可能需要额外的root权限。根据需要授予它们,并在达到pyodbc连接时撤销。

  1. 的文件odbc.iniodbcinst.ini也应该出现在/Users/<username>/etc,除了官方的文档指定位置。

  2. /(root directory)中也应该有odbcinst.ini的副本。

  3. 文件freetds.conf应存在于/usr/local/etc目录中。

  4. 如果您使用SQL Server 2014及更高版本,则应将tds版本设置为7.4。不要将tds版本设置为8,因为它只是7.1的别名。

  5. 检查文件/usr/local/lib/libtdsodbc.so是否具有执行权限。如果不是,则通过chmod授予766/744/777(在最坏情况下)特权。这一步对于运行osql/isql和python的pyodbc连接是至关重要的。

在这些步骤之后,重新检查一次的odbc.iniodbcinst.inifreetds.conf的内容,并确认它们是按照文档(https://github.com/mkleehammer/pyodbc/wiki/Connecting-to-SQL-Server-from-Mac-OSX

运行ISQL/OSQL。

如果一切正常,现在你已经设置好从python连接到SQLServer。以下片段显示了基本的连接过程。

import pyodbc 

connection = pyodbc.connect('DSN=MYMSSQL;UID=<user_id for db_login>;PWD=<password_for db_login>) 
cursor = connection.cursor() 

result = cursor.execute("select @@VERSION").fetchall() 
print(result) 

cursor.close() 
connection.close()