【问题标题】:How to edit the path in odbcinst -j如何在 odbcinst -j 中编辑路径
【发布时间】:2017-05-25 21:55:05
【问题描述】:

当我查看此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,当我展示它时,它会显示错误的路径。不知道怎么解决?

【问题讨论】:

  • 这篇文章有用吗? denverpsmith.com/posts/…
  • 我对您要连接到哪个数据库感到困惑,您能否确认一下:您已将此问题标记为 sql-server,但您的驱动程序设置似乎正在使用 mysql。我记得,sql-server 的驱动程序被命名为 libtdsodbc.so 而不是 libodbcmyS.so。也许这是你的问题?
  • 我不知道您要问的产品,但您写道:“但是没有位置/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
  • @ThomasHedden 是的,我试过了。我创建了目录并复制了文件。但它也没有工作。
  • 您是否正确导出了正确的环境变量?也许您可以将它们放在您的 .bashrc 或类似文件中。 export ODBCINI=/etc/odbc.iniexport ODBCSYSINI=/etc 这样可以指向正确的文件吗?如果可行,我会写下来......

标签: python sql-server ubuntu-14.04


【解决方案1】:

看起来“默认”路径设置不正确。
我很确定您已经这样做了,因为它在不同的地方提到,但我想提醒您应该按照以下链接中的说明设置正确的环境变量:
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" )读取环境变量。对其他人类似。现在,原始代码有了另一个分支,但最终使用自定义函数做了类似的事情。

【讨论】:

  • 现在显示以下错误pyodbc.Error: ('IM004', "[IM004] [unixODBC][Driver Manager]Driver's SQLAllocHandle on SQL_HANDLE_HENV failed (0) (SQLDriverConnect)")
  • 可能与以下有关? paulsprogrammingnotes.com/2014/06/…你能检查一下吗?
  • 我修好了。谢谢朋友的帮助:)
  • @mkHun 请问你是怎么解决的?
【解决方案2】:

我相信您得到错误的根源是因为您的 .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。 (注意:这个答案取决于您已经添加的符号链接。)

【讨论】:

  • 现在显示如下错误pyodbc.Error: ('IM004', "[IM004] [unixODBC][Driver Manager]Driver's SQLAllocHandle on SQL_HANDLE_HENV failed (0) (SQLDriverConnect)")
【解决方案3】:

如果您尚未重置 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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多