2017-01-11 5 views
8

, wenn ich diese Ansicht odbcinst -j esWie der Pfad in odbcinst bearbeiten -j

unixODBC 2.2.14 
DRIVERS............: /etc/unixODBC/odbcinst.ini 
SYSTEM DATA SOURCES: /etc/unixODBC/odbc.ini 
FILE DATA SOURCES..: /etc/unixODBC/ODBCDataSources 
USER DATA SOURCES..: /etc/unixODBC/odbc.ini 
SQLULEN Size.......: 8 
SQLLEN Size........: 8 
SQLSETPOSIROW Size.: 8 

zeigt Aber es gibt keinen Ort /etc/unixODBC/odbcinst.ini. Der tatsächliche Standort ist /etc/odbcinst.ini, also muss ich den Standort ändern. Wie kann ich es tun?

Ich versuche unter Skript

import pyodbc 
cnxn = pyodbc.connect('DRIVER={SQLServer};SERVER=10.10.10.1;DATABASE=ABC;UID=username;PWD=password') 
cursor = cnxn.cursor() 

Aber es zeigt den folgenden Fehler

pyodbc.Error: ('IM002', '[IM002] [unixODBC][Driver Manager]Data source name not found, and no default driver specified (0) (SQLDriverConnect)') 

und ich hinzugefügt, um die odbc.in und odbcinst.ini Dateiinformationen zu laufen als

folge
cat odbc.ini 
[SQLServer] 
Description  = ODBC for MSSQL 
Driver   = /usr/lib/x86_64-linux-gnu/odbc/libodbcmyS.so 
Servername  = 
Database  = 
UID    = 
Port   = 1433 

cat /etc/odbcinst.ini 
[SQLServer] 
Description  = ODBC for MSSQL 
Driver   = /usr/lib/x86_64-linux-gnu/odbc/libodbcmyS.so 
Setup   = /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so 
UsageCount  = 1 
FileUsage  = 1 

Ich hoffe, dass das Problem in odbcinst -j ist, wenn ich es zeige, zeigt es den falschen Weg an. Ich kann nicht reparieren.

+0

ist dieser Beitrag hilfreich? http://denverpsmith.com/posts/connecting-to-mssql-database-from-linuxmac – denvaar

+0

Ich bin verwirrt, mit welcher Datenbank Sie verbinden möchten, können Sie bitte bestätigen: Sie haben diese Frage als sql- getaggt Server, aber Ihr Treiber-Setup scheint mit MySQL zu verwenden. Die Treiber, wie ich mich erinnere, für sql-Server sind so etwas wie libtdsodbc.so nicht libodbcmyS.so benannt. Vielleicht ist das dein Problem? – gregory

+0

Ich kenne das Produkt nicht, über das du fragst, aber du hast geschrieben: "Aber es gibt keinen Ort /etc/unixODBC/odbcinst.ini. Der tatsächliche Ort ist /etc/odbcinst.ini, also muss ich den Ort ändern . " Wenn das alles, was Sie tun wollen, würde ich fügen Sie einfach einen symbolischen Link: Wenn das Verzeichnis nicht vorhanden ist, dann: $ mkdir/etc/unixODBC $ cd /etc/unixODBC pwd $ /etc/unixODBC $ ln -s /etc/odbcinst.ini. $ ls -l lrwxrwxrwx ... odbcinst.ini -> /etc/unixODBC/odbcinst.ini –

Antwort

4

Es sieht so aus, als wäre der "Standard" -Pfad nicht korrekt eingestellt.
Ich bin mir ziemlich sicher, dass Sie tun es bereits, wie es an verschiedenen Orten erwähnt wird, aber ich möchte daran erinnern, dass Sie die richtigen Umgebungsvariablen setzen sollte, wie in den folgenden Links beschrieben:
http://www.raosoft.com/ezsurvey/help/2007/odbc_in_unix.html http://gemfirexd.docs.pivotal.io/1.3.0/userguide/developers_guide/topics/odbc/install_config_odbc.html
Es bedeutet, In diesem Fall könnten Sie ein paar Zeilen zu Ihrer .bashrc oder .bash_profile oder ähnlich hinzufügen, so dass das Programm jedes Mal auf die richtigen Stellen zeigt, wenn Sie Ihre Shell öffnen.
Die Linien dann wäre hinzuzufügen: auf den Quellcode von unixODBC-2,2

export ODBCINI=/etc/odbc.ini 
export ODBCSYSINI=/etc 

Blick in der Tat.14-p2 Paket, wenn odbcinst -j Aufruf wird die folgende Verzweigung im Code

case 'j': 
    PrintConfigInfo(); 
    exit(0); 

und PrintConfigInfo() wird den Job zu drucken ein paar Infos gehen, speziell, was Sie

void PrintConfigInfo() 
{ 
    char szFileName[ODBC_FILENAME_MAX+1]; 
     char b1[ 256 ], b2[ 256 ]; 

    printf("unixODBC " VERSION "\n"); 

    *szFileName = '\0'; 
    sprintf(szFileName, "%s/odbcinst.ini", odbcinst_system_file_path(b1), odbcinst_system_file_name(b2)); 
    printf("DRIVERS............: %s\n", szFileName); 

    *szFileName = '\0'; 
    _odbcinst_SystemINI(szFileName, FALSE); 
    printf("SYSTEM DATA SOURCES: %s\n", szFileName); 

    *szFileName = '\0'; 
    _odbcinst_FileINI(szFileName); 
    printf("FILE DATA SOURCES..: %s\n", szFileName); 

    *szFileName = '\0'; 
    _odbcinst_UserINI(szFileName, FALSE); 
    printf("USER DATA SOURCES..: %s\n", szFileName); 

    printf("SQLULEN Size.......: %d\n", sizeof(SQLULEN)); 
    printf("SQLLEN Size........: %d\n", sizeof(SQLLEN)); 
    printf("SQLSETPOSIROW Size.: %d\n", sizeof(SQLSETPOSIROW)); 
} 
siehe

Lassen Sie uns nun eine der print-Anweisungen untersuchen, um zu verstehen, woher der Pfad kommt. Nehmen wir zum Beispiel die Zeile

printf("SYSTEM DATA SOURCES: %s\n", szFileName); 

wo szFileName durch folgenden Aufruf gesetzt ist:

_odbcinst_SystemINI(szFileName, FALSE); 

, die in der Datei definiert ist odbcinst/_odbcinst_SystemINI.c:

BOOL _odbcinst_SystemINI(char *pszFileName, BOOL bVerify) 
{ 
     FILE     *hFile; 
     char     b1[ 256 ]; 

    sprintf(pszFileName, "%s/odbc.ini", odbcinst_system_file_path(b1)); 

     if (bVerify) 
     { 
     /* try opening for read */ 
       hFile = uo_fopen(pszFileName, "r"); 
       if (hFile) 
         uo_fclose(hFile); 
       else 
     { 
      /* does not exist so try creating it */ 
      hFile = uo_fopen(pszFileName, "w"); 
      if (hFile) 
       uo_fclose(hFile); 
      else 
       return FALSE; 
     } 
     } 

     return TRUE; 
} 

wo es die Saitensätze

in der folgenden Zeile gedruckt werden
sprintf(pszFileName, "%s/odbc.ini", odbcinst_system_file_path(b1)); 

Um zu verstehen, wie odbcinst_system_file_path(b1) diesen Pfad setzt, schauen wir uns die Quelle an und man findet

char *odbcinst_system_file_path(char *buffer) 
{ 
    char *path; 
    static char save_path[ 512 ]; 
    static int saved = 0; 

    if (saved) { 
      return save_path; 
    } 

    if ((path = getenv("ODBCSYSINI"))) { 
       strcpy(buffer, path); 
     strcpy(save_path, buffer); 
     saved = 1; 
     return buffer; 
     } 
#ifdef SYSTEM_FILE_PATH 
    else { 
     strcpy(save_path, SYSTEM_FILE_PATH); 
     saved = 1; 
     return SYSTEM_FILE_PATH; 
     } 
#else 
    else { 
     strcpy(save_path, "/etc"); 
     saved = 1; 
     return "/etc"; 
     } 
#endif 
} 

die wie Sie sehen können die Umgebungsvariable durch getenv("ODBCSYSINI") lesen. Ähnlich für andere. Jetzt hat der ursprüngliche Code eine andere Verzweigung, aber endet mit einer ähnlichen Sache mit benutzerdefinierten Funktionen.

+0

Nun zeigt es den folgenden Fehler 'pyodbc.Fehler: ('IM004', "[IM004] [UnixODBC] [Treiber-Manager] Treiber SQLAllocHandle auf SQL_HANDLE_HENV fehlgeschlagen (0) (SQLDriverConnect)") – mkHun

+0

Konnte es mit dem Folgenden verwandt sein? http://www.paulsprogrammingnotes.com/2014/06/im004-unixodbcdriver-managerdrivers.html Könnten Sie das überprüfen? – fedepad

+0

Ich habe es behoben. Danke Freund für Ihre Hilfe :) – mkHun

1

Ich glaube, die Wurzel des Fehlers, den Sie erhalten, liegt daran, dass Ihre DRIBER-Definition von .odbc.ini nicht auf den Treibernamen Ihres odbcinst.ini zeigt.

Es sollte wie folgt sein:

cat odbc.ini 
[SQLServer] 
Description  = ODBC for MSSQL 
Driver   = DRIVER_ISSUE 
Servername  = 
Database  = 
UID    = 
Port   = 1433 

cat /etc/odbcinst.ini 
[DRIVER_ISSUE] 
Description  = ODBC for MSSQL 
Driver   = /usr/lib/x86_64-linux-gnu/odbc/libodbcmyS.so 
Setup   = /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so 
UsageCount  = 1 
FileUsage  = 1 

Hinzu kommt, glaube ich Ihren Fahrer (libodbcmyS.so) für SQL-Server nicht korrekt ist. (Hinweis: Diese Antwort hängt vom symbolischen Link ab, den Sie bereits hinzugefügt haben.)

+0

Jetzt ist es zeigt den folgenden Fehler 'pyodbc.Error: ('IM004'," [IM004] [UnixODBC] [Treiber-Manager] Treiber SQLAllocHandle auf SQL_HANDLE_HENV fehlgeschlagen (0) (SQLDriverConnect) ") ' – mkHun