本文介紹了如何在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
,當我顯示它時,它顯示了錯誤的路徑。我不知道如何修復。?
推薦答案
看起來”默認”路徑設置不正確。
我非常肯定您已經按照不同地方提到的方式進行了設置,但我想提醒您,您應該按照以下鏈接中的說明設置正確的環境變量:
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
或類似的位置添加幾行代碼,以便每次打開外殼程序時程序都指向正確的位置。
要添加的行將為:
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 "
" );
*szFileName = '';
sprintf( szFileName, "%s/odbcinst.ini", odbcinst_system_file_path( b1 ), odbcinst_system_file_name( b2 ));
printf( "DRIVERS............: %s
", szFileName );
*szFileName = '';
_odbcinst_SystemINI( szFileName, FALSE );
printf( "SYSTEM DATA SOURCES: %s
", szFileName );
*szFileName = '';
_odbcinst_FileINI( szFileName );
printf( "FILE DATA SOURCES..: %s
", szFileName );
*szFileName = '';
_odbcinst_UserINI( szFileName, FALSE );
printf( "USER DATA SOURCES..: %s
", szFileName );
printf( "SQLULEN Size.......: %d
", sizeof( SQLULEN ));
printf( "SQLLEN Size........: %d
", sizeof( SQLLEN ));
printf( "SQLSETPOSIROW Size.: %d
", sizeof( SQLSETPOSIROW ));
}
現在讓我們檢查一條print語句,以了解它從哪里獲得路徑,讓我們以行為例
printf( "SYSTEM DATA SOURCES: %s
", 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" )
讀取環境變量。其他人也是如此。現在,原始代碼有了另一個分支,但最終使用自定義函數執行了類似的操作。
這篇關于如何在odbcinst-j中編輯路徑的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,