看来“默认”路径设置不正确。
我很确定您已经这样做了,正如在不同地方提到的那样,但我想提醒您应该设置正确的环境变量,如以下链接中所述:
http://www.raosoft.com/ezsurvey/help/2007/odbc_in_unix.html 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 http://gemfirexd.docs.pivotal.io/1.3.0/userguide/developers_guide/topics/odbc/install_config_odbc.html
这意味着在您的情况下,您可以在您的代码中添加几行.bashrc
or .bash_profile
或类似的,以便每次您打开 shell 时程序都指向正确的位置。
要添加的行将是:
export ODBCINI=/etc/odbc.ini
export ODBCSYSINI=/etc
确实查看了源代码unixODBC-2.2.14-p2包,调用时odbcinst -j
它将经过代码中的以下分支
case 'j':
PrintConfigInfo();
exit(0);
and 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 );
where 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" )
。其他人也类似。现在,原始代码有另一个分支,但最终使用自定义函数执行类似的操作。