2017-01-11 86 views
8

時,我認爲這odbcinst -j它顯示如何編輯ODBCINST路徑-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 

但沒有位置/etc/unixODBC/odbcinst.ini。實際位置是/etc/odbcinst.ini,所以我需要更改位置。我該怎麼做?

我想下面的腳本

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

運行,但它顯示了以下錯誤

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

,我添加了odbc.in和ODBCINST.INI文件信息如下

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 

我希望問題是在odbcinst -j當我顯示它顯示錯誤的路徑。我不知道如何解決。?

+0

是這個職位有幫助嗎? http://denverpsmith.com/posts/connecting-to-mssql-database-from-linuxmac – denvaar

+0

我爲你想連接到的數據庫困惑,可以請你確認:您已經標記了這個問題作爲SQL的服務器,但你的驅動程序設置看起來是使用MySQL。我記得,對於sql-server的驅動程序被命名爲libtdsodbc.so而不是libodbcmyS.so。也許這是你的問題? – gregory

+0

我不知道你是問有關產品,但你說:「但有沒有位置/etc/unixODBC/odbcinst.ini的實際位置是/etc/odbcinst.ini所以我需要改變位置。 「。如果這是你想做的事,我只想補充一個符號鏈接: 如果該目錄不存在,那麼: $ MKDIR的/ etc/unixODBC的 $ CD 的/ etc/unixODBC的 $ PWD 的/ etc/unixODBC的 $ ln -s /etc/odbcinst.ini。 $ ls -l命令 lrwxrwxrwx ... ODBCINST.INI - > /etc/unixODBC/odbcinst.ini –

回答

4

它看起來像「默認」路徑設置不正確。
我敢肯定你已經在做了,因爲它是在不同的地方被提及,但我要提醒你應該設置正確的環境變量,如以下鏈接描述:
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
這意味着在你的情況下,你可以添加幾行到你的.bashrc.bash_profile或類似的文件,以便程序每次打開你的shell時指向正確的位置。
增加會然後行:

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

的unixODBC-2.2的源代碼看確實如此。14-P2包,調用odbcinst -j時它會經過下面的分支中的代碼

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

PrintConfigInfo()將做印刷一堆信息的工作,特別是你所看到的

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)); 
} 

現在讓我們來看看打印報告之一,以瞭解它從哪裏獲得路徑,讓我們以行爲爲例

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

其中szFileName由下面的呼叫建立:

_odbcinst_SystemINI(szFileName, FALSE); 

它是文件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; 
} 

在那裏設置字符串在下面的行

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

要了解如何odbcinst_system_file_path(b1)套這條道路,我們看看源和一個發現

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 
} 

你可以看到通過getenv("ODBCSYSINI")閱讀環境變量。與其他類似。現在,原始代碼有另一個分支,但最終使用自定義函數做類似的事情。

+0

現在它顯示以下錯誤'pyodbc。錯誤:('IM004','[IM004] [unixODBC] [驅動程序管理器] SQL_HANDLE_HENV上的驅動程序SQLAllocHandle失敗(0)(SQLDriverConnect)「)' – mkHun

+0

它可能與以下內容有關? http://www.paulsprogrammingnotes.com/2014/06/im004-unixodbcdriver-managerdrivers.html你能檢查嗎? – fedepad

+0

我修好了。謝謝你的朋友的幫助:) – mkHun

1

我相信你所得到的錯誤的根源,是因爲你的.odbc.ini的驅動程序定義沒有指向您的ODBCINST.INI的驅動程序名稱。

應該是這樣的:

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 

在此之上,我相信你的驅動程序(libodbcmyS.so)不是SQL-服務器正確。 (注:此答案取決於你已經添加的符號鏈接。)

+0

現在它顯示以下錯誤'pyodbc.Error:('IM004','[IM004] [unixODBC] [驅動程序管理器] SQL_HANDLE_HENV上的驅動程序的SQLAllocHandle失敗(0)(SQLDriverConnect)「) ' – mkHun