如何在 odbcinst -j 中编辑路径
How to edit the path in 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
上,当我显示它时它显示错误的路径。我不知道如何解决。?
看来 "default" 路径设置不正确。
我很确定你已经在这样做了,因为它在不同的地方都提到过,但我想提醒你应该按照以下链接中的描述设置正确的环境变量:
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 = '[=12=]';
sprintf( szFileName, "%s/odbcinst.ini", odbcinst_system_file_path( b1 ), odbcinst_system_file_name( b2 ));
printf( "DRIVERS............: %s\n", szFileName );
*szFileName = '[=12=]';
_odbcinst_SystemINI( szFileName, FALSE );
printf( "SYSTEM DATA SOURCES: %s\n", szFileName );
*szFileName = '[=12=]';
_odbcinst_FileINI( szFileName );
printf( "FILE DATA SOURCES..: %s\n", szFileName );
*szFileName = '[=12=]';
_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" )
读取环境变量。其他人也类似。现在,原始代码有另一个分支,但最终使用自定义函数做了类似的事情。
我认为您遇到的错误的根源是因为您的 .odbc.ini 的 DRIVER 定义没有指向您的 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-Server。 (注意:此答案取决于您已添加的符号 link。)
如果您还没有重置 odbcinst.ini
,请试试这个
cnx = pyodbc.connect(server=servername, database = DBname, user=Username,
tds_version='7.3',password=Password,port=portno,
driver='/usr/local/lib/libtdsodbc.so')
当我查看此 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
上,当我显示它时它显示错误的路径。我不知道如何解决。?
看来 "default" 路径设置不正确。
我很确定你已经在这样做了,因为它在不同的地方都提到过,但我想提醒你应该按照以下链接中的描述设置正确的环境变量:
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 = '[=12=]';
sprintf( szFileName, "%s/odbcinst.ini", odbcinst_system_file_path( b1 ), odbcinst_system_file_name( b2 ));
printf( "DRIVERS............: %s\n", szFileName );
*szFileName = '[=12=]';
_odbcinst_SystemINI( szFileName, FALSE );
printf( "SYSTEM DATA SOURCES: %s\n", szFileName );
*szFileName = '[=12=]';
_odbcinst_FileINI( szFileName );
printf( "FILE DATA SOURCES..: %s\n", szFileName );
*szFileName = '[=12=]';
_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" )
读取环境变量。其他人也类似。现在,原始代码有另一个分支,但最终使用自定义函数做了类似的事情。
我认为您遇到的错误的根源是因为您的 .odbc.ini 的 DRIVER 定义没有指向您的 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-Server。 (注意:此答案取决于您已添加的符号 link。)
如果您还没有重置 odbcinst.ini
,请试试这个cnx = pyodbc.connect(server=servername, database = DBname, user=Username,
tds_version='7.3',password=Password,port=portno,
driver='/usr/local/lib/libtdsodbc.so')