【问题标题】:How to create ODBC "DSN" for cross-platform testing?如何为跨平台测试创建 ODBC“DSN”?
【发布时间】:2021-07-24 19:53:05
【问题描述】:

我需要一个关于 WIN 的简单 ODBC 测试场景,我可以非常简单地对其进行配置,并确保它能够支持Unix.SE 上的另一个问题。

简而言之,我正在尝试在 KVM/QEMU 虚拟系统 (192.168.1.12) 中设置从 Debian 10 (192.168.1.2) 到 Windows 10 的 PyODBC/Python 脚本连接。

首先,在 Windows 10/KVM 上,我看到 ODBC Data Source Administrator 有一个标签 File DSNMicrosoft Text Driver我可以使用 FileDSN 测试 Python PyODBC 与 ODBC 的连接,使用一个简单的 CSV 文件代替服务器吗?(我对 ODBC 的研究只发现正在运行的服务器实例)。

接下来,我尝试了什么:

  • 在 Debian 上,我安装了 ODBC Microsoft driver for Linux

  • 关闭 Windows 10 防火墙,我可以双向 ping:

    $nmap -p 22 192.168.1.12#Deb 赢

    > Test-NetConnection 192.168.1.2 -p 22#赢给Deb

  • 在 Windows 10/KVM 上,我使用 Microsoft 文本驱动程序添加了 FileDSN。我创建了一个带有简单标题和一行数据的 CSV 文件 (odbc_test_01.csv) (IE.{'ID' : 1, 'NAME' : 'FOO'})

  • 创建了一个 Jupyter Notebook 以简化测试。这是我的连接字符串和结果:

    cn = pyodbc.connect(r'Driver={ODBC Driver 17 for SQL Server};' # Driver installed above
                    r'FILEDSN=odbc_test_01.csv;'  # my attempt at FileDSN
                    r'SERVER=192.168.1.12;'  # KVM IP tested with ping
                    r'Trusted_Connection=no;' # explicit; use UID/PWD
                    r'UID=<username>;'   # Windows user name 
                    r'PWD=<password>',  # Windows user password 
                    autocommit=True)
    
    OperationalError: ('HYT00', '[HYT00] [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired (0) (SQLDriverConnect)')
    
  • 用相同的字符串从 Debian 命令行尝试isql

    isql -v -k ''Driver={ODBC Driver 17 for SQL Server};FILEDSN=odbc_test_01.csv;SERVER=192.168.1.12; Trusted_Connection=no;UID=&lt;username&gt;;PWD=&lt;password&gt;'

SO 的类似页面:

Authenticate from Linux to Windows SQL Server with pyodbc

Python pyodbc connect to Sql Server using SQL Server Authentication

【问题讨论】:

    标签: windows odbc pyodbc


    【解决方案1】:

    ODBC“文件 DSN”不是用于访问文件中数据的驱动程序。这是一种将 DSN(目标数据库的连接信息)指定为独立文件中的值的方法,而不是在 Linux 上的标准配置文件(例如,/etc/odbc.ini)或 Windows 注册表中.

    如果您需要“克隆”一个 Windows DSN 条目以在 Linux 环境中使用,那么您可能会发现我的 dump_dsn 实用程序很有帮助。它从 Windows 注册表中检索 ODBC DSN,并以可用于在 Linux 上重新创建 DSN 的形式显示它。

    例如,假设我在 Windows 上有一个名为“mssql199”的 DSN,当我在其上运行 dump_dsn.to_text("mssql199") 时,我得到了

    [mssql199]
    Driver=ODBC Driver 17 for SQL Server
    Description=with UseFMTONLY
    Server=192.168.0.199
    Database=myDb
    Encrypt=No
    TrustServerCertificate=No
    ClientCertificate=
    KeystoreAuthentication=
    KeystorePrincipalId=
    KeystoreSecret=
    KeystoreLocation=
    UseFMTONLY=Yes
    Trusted_Connection=No
    

    要在 Linux 机器上使用相同的 DSN,我必须这样做

    1. 将该块复制到/etc/odbc.ini(或等效的“系统DSN”)或~/.odbc.ini(用于“用户DSN”)以使用DSN=mssql199,或
    2. 将带有[ODBC] 标头而不是[mssql199] 的块保存到文件中,例如/home/gord/mssql199_file.dsn(用于“文件DSN”)并使用FILEDSN=/home/gord/mssql199_file.dsn

    编辑回复:“我可以使用 FileDSN 测试 Python PyODBC 与 ODBC 的连接,使用简单的 CSV 文件代替服务器吗??”

    没有。 Windows 机器上的 ODBC DSN 或 FILEDSN 仅用于将 Windows 机器连接到数据源(本地或其他机器上)。我们无法一台机器(例如 Linux)连接到另一台机器上的 ODBC DSN 条目

    【讨论】:

      【解决方案2】:

      我创建了一个 SQLite 数据库。然后我添加了SQLite drivers for ODBC

      【讨论】:

        猜你喜欢
        • 2020-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-29
        • 2012-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多