2013-06-04 17 views
10

So habe ich große Schwierigkeiten, alle drei in Harmonie miteinander zu arbeiten. Ich schätze, ich werde alle verschiedenen Konfigurationen zusammen mit dem Testcode auflisten, um zu sehen, ob ein Paar frische Augen meine Dummheit erkennen kann.Probleme mit UnixODBC, FreeTDS und PyODBC haben

Ich bin 12.04 Unbuntu Server laufen und ich versuche, eine Verbindung zu einem MSSQL Server 2008 und am Ende mit PyODBC.

Wenn jedoch gerade dabei in

tsql -S T2 -U Foo -P Bar 

ich die

1> 
2> 
3> 
4> 
5> 
6> 
7> 
8> 
9> 
10> 
11> 

und etc.

Wie auch immer, wenn jemand zu helfen, wäre in der Lage (und ich würde ewig dankbar sein Wenn Sie mich von diesem Schleier befreien können), hier sind meine aktuellen Konfigurationen.

Das ist mein /etc/odbc.ini

[ODBC Data Sources] 
odbcname  = MySQL 
T2   = MSSQL 

[odbcname] 
Driver  = /usr/lib/odbc/libmyodbc.so 
Description = MyODBC 3.51 Driver DSN 
SERVER  = Foobar 
PORT   = 3306 
USER   = Foo 
Password  = Bar 
Database  = Foobar 
OPTION  = 3 
SOCKET  = 

[T2] 
Driver  = FreeTDS 
Description = ODBC connection via FreeTDS 
SERVER  = FOOBAR 
PORT   = 1433 
USER   = Foo 
Password  = Bar 
Database  = Foobar 
OPTION  = 3 
SOCKET  = 

[Default] 
Driver  = /usr/local/lib/libmyodbc3.so 
Description = MyODBC 3.51 Driver DSN 
SERVER  = FOOBAR 
PORT   = 3306 
USER   = foo 
Password  = bar 
Database  = FOOBAR 
OPTION  = 3 
SOCKET  = 

Die folgende meine /etc/odbcinst.ini ist

[FreeTDS] 
Description=FreeTDS Driver 
Driver=/usr/lib/odbc/libtdsodbc.so 
Setup=/usr/lib/odbc/libtdsS.so 
CPTimeout= 
CPReuse= 
FileUsage=1 

Das Folgende ist meine freetds.conf

# This file is installed by FreeTDS if no file by the same 
# name is found in the installation directory. 
# 
# For information about the layout of this file and its settings, 
# see the freetds.conf manpage "man freetds.conf". 

# Global settings are overridden by those in a database 
# server specific section 
[global] 
     # TDS protocol version 
;  tds version = 4.2 

     # Whether to write a TDSDUMP file for diagnostic purposes 
     # (setting this to /tmp is insecure on a multi-user system) 
;  dump file = /tmp/freetds.log 
;  debug flags = 0xffff 

     # Command and connection timeouts 
;  timeout = 10 
;  connect timeout = 10 

     # If you get out-of-memory errors, it may mean that your client 
     # is trying to allocate a huge buffer for a TEXT field. 
     # Try setting 'text size' to a more reasonable limit 
     #text size = 64512 

[T2] 
     host = FOOBAR 
     port = 1433 
     tds version = 7.0 
     client charset = UTF-8 
     text size = 20971520 
[global] 
     # TDS protocol version 
     tds version = 7.0 

Und meine Python-Testdatei nur für ein gutes Maß

import pyodbc 
import sys 

try: 
    #tempsystrends = pyodbc.connect('DRIVER=FreeTDS;SERVER=FOOBAR;PORT=1433;DATABASE=T2;UID=FOO;PWD=bar;TDS_Version=7.0;') 
    cursor = tempsystrends.cursor() 
except pyodbc.Error as e: 
     print "Error: %s" % (e.args[1]) 
     sys.exit(1) 

Antwort

13

ich eine Verbindung zu verschiedenen Datenbanken über PHP UnixODBC verwenden, hier ist meine Konfiguration für einen Microsoft SQL Server:

/etc/odbc.ini

# Define a connection to a Microsoft SQL server 
# The Description can be whatever we want it to be. 
# The Driver value must match what we have defined in /etc/odbcinst.ini 
# The Database name must be the name of the database this connection will connect to. 
# The ServerName is the name we defined in /etc/freetds/freetds.conf 
# The TDS_Version should match what we defined in /etc/freetds/freetds.conf 
[mssql] 
Description    = MSSQL Server 
Driver     = freetds 
Database    = XXXXXX 
ServerName    = MSSQL 
TDS_Version    = 8.0 

/etc/odbcinst.ini

# Define where to find the driver for the Free TDS connections. 
[freetds] 
Description  = MS SQL database access with Free TDS 
Driver   = /usr/lib/i386-linux-gnu/odbc/libtdsodbc.so 
Setup   = /usr/lib/i386-linux-gnu/odbc/libtdsS.so 
UsageCount  = 1 

/etc/freetds/freetds.conf

# The basics for defining a DSN (Data Source Name) 
# [data_source_name] 
#  host = <hostname or IP address> 
#  port = <port number to connect to - probably 1433> 
#  tds version = <TDS version to use - probably 8.0> 

# Define a connection to the Microsoft SQL Server 
[mssql] 
     host = XXXXXX 
     port = 1433 
     tds version = 8.0 
Testen

dann Ihre Verbindung:

isql mssql username password 

Abhängig von Ihrer Umgebung Ihre username könnte im Format sein müssen: Domäne \ Benutzername

Nach der Ausgabe des Befehls Sie wie etwas sehen sollte:

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

WOW. Dies ist vielleicht die vollständigste Antwort, die ich jemals auf Stack Overflow gelesen habe. Nur ändern für mich war, den Speicherort für 64bit in /etc/odbcinst.ini zu ändern: /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so – philshem

+1

@philshem - danke, ich bin froh, dass es nützlich war! –

+2

Die vollständigste Antwort bisher! – digz6666