【问题标题】:How to define a driver for tclodbc?如何为 tclodbc 定义驱动程序?
【发布时间】:2012-06-05 11:24:35
【问题描述】:

我想使用 Linux 环境中的 tclodbc 连接到 MS SQL 服务器。我有驱动程序(freeTDS)和连接字符串。但我不知道如何配置 tclodbs 使用的驱动程序。有一个命令

数据库配置 操作驱动属性

但是我不知道应该把operationattributes 写成什么,以及这是否是正确的命令。

与我的问题有关:Accessing Microsoft SQL Server from Tcl running on GNU/Linux

【问题讨论】:

    标签: sql odbc tcl freetds


    【解决方案1】:

    如果我们查看documentation,我们会看到有6 个操作,其中您可能想要的一个是add_dsn。包括一个示例(如下,稍作修正):

    set driver "Microsoft Access Driver (*.mdb)" 
    set attributes [list "DSN=mydsn" "DBQ=c:\mydb.mdb" "FIL=MS Access"] 
    database configure add_dsn $driver $attributes 
    

    恐怕您必须查阅 FreeTDS 文档才能获得正确的属性集合,但我认为(基于 this evidence)您将拥有驱动程序为 @ 987654325@ 和属性 可能 如果它是一个空列表(或其中只有 TDS_Version=5.0),则可以。配置ODBC我真的不是太懂……

    【讨论】:

    • 恐怕database configure add_dsn ... 命令会尝试配置每个用户的DSN(可能在用户的主目录下创建/更新一些众所周知的文件),这可能不是预期的。似乎 OP 采取了一些错误的路线——正确的路线是进行无 DSN 设置。
    【解决方案2】:

    好的,这是我基于theseguides 的关于如何使用 FreeTDS 驱动程序建立无 DSN 连接的看法。

    我已经测试了一个 Debian Lenny 系统,该系统针对一个实例安装了 tclodbc 2.5-5、unixodbc 2.2.11 和 libdbd-freetds 0.8.2-1-4.1 和 tcl 8.4.16-2的 Microsoft SQL Server 2005。

    package require tclodbc
    
    proc cs_append {varName args} {
        set alen [llength $args]
        if {$alen < 2 || $alen % 2 != 0} {
            return -code error "Wrong # args: should be varName key value ?key value?"
        }
    
        upvar 1 $varName qs
    
        foreach {key value} $args {
            if {$qs ne ""} {
                append qs \;
            }
            append qs $key = \{ [string map {\{ \\\{} $value] \}
        }
    }
    
    set user test
    set pass secret
    
    set cs ""
    cs_append cs DRIVER FreeTDS UID $user PWD $pass \
        Server myserver.domain.local \
        ClientCharset UTF-8 \
        APP "My test app"
    
    database connect db $cs
    foreach row [db {select * from MyDatabase..MyTable}] {
        puts $row
    }
    db disconnect
    

    一些注意事项:

    • FreeTDS 驱动程序必须通过在/etc/odbcinst.ini 文件中注册来为 ODBC 子系统所知。我想至少在我的系统上,适当的软件包会自己处理这个问题,但您最好验证您是否在该文件中注册了 FreeTDS,否则连接字符串中的 DRIVER=FreeTDS 位将不起作用,因为 ODBC 将没有了解如何加载命名的驱动程序库。
    • ClientCharsetAPP 连接字符串参数在我的情况下不起作用。 虽然我可以接受第二个,但第一个很糟糕,因为在这种情况下字符数据是以一些拙劣的编码返回。

      但是,当我使用 /etc/freetds/freetds.conf 文件中的命名服务器时,在连接字符串中使用 ServerName=THAT_SERVER 而不是 Server=SERVER_HOST 时,没有这样的问题。不幸的是,这种方式违背了使用无 DSN 设置的一半目的。

      很可能这是我的 FreeTDS 驱动程序版本中的一个错误,我这里的系统确实过时了,所以 YMMV 和你最好检查一下你的系统。

    【讨论】:

      猜你喜欢
      • 2021-05-28
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 2013-04-08
      • 1970-01-01
      • 2018-03-26
      • 2016-09-22
      相关资源
      最近更新 更多