【问题标题】:using Tcl with tdbc over MS SQL on Win x64在 Win x64 上通过 MS SQL 使用 Tcl 和 tdbc
【发布时间】:2017-05-23 12:49:55
【问题描述】:

几年来,我们一直在使用 tclodbc 包对 MS SQL Server 运行查询。现在我们必须切换到 x64 进程并且 tclodbc 没有加载,因为没有 x64 版本。

我们开始寻找替代方案并尝试了 tdbc,但我们遇到了将字符字段作为参数传递的问题。我创建了一个包含 2 个整数列和 2 个 varchar 列(50 和 100 长)的测试表。

我正在尝试插入记录,但发生了以下情况: 1. 如果我插入只提供 2 个整数参数的记录,一切正常 - 插入 5 条记录(参见下面的代码)。 2. 如果我插入仅提供 1 个字符参数的记录,则插入 1 条记录,然后脚本失败并出现以下错误:“[Microsoft][ODBC Driver 11 for SQL Server]String data, right truncation” 3. 如果我传递两个字符参数或一个整数参数和一个字符参数,则不会插入任何内容 - 我得到与上述相同的错误。

我没有测试任何其他数据类型,但字符参数似乎有问题(我也尝试了 nvarchar 和 char 类型列)。

这是我的代码:

package require tdbc::odbc
set con "Driver=\{ODBC Driver 11 for SQL Server\};server=server;database=database;Intergrated Security=True;Trusted_Connection=Yes"
tdbc::odbc::connection create db $con

set insert_cmd [db prepare {INSERT INTO dbo.testing_tdbc (f50,f100) VALUES(:f50,:f100) } ]
$insert_cmd paramtype f50 char 50
$insert_cmd paramtype f100 char 100

foreach fint [list 1 2 3 4 5] {
    set fi1 $fint
    set fi2 [expr {$fi1*2}]
    set f50 "${fi2}_${fi1}"
    set f100 $f50

    $insert_cmd execute
}

$insert_cmd close
db close

我对 SQL Server 的 ODBC 驱动程序 13 进行了同样的尝试 - 结果都相同。

【问题讨论】:

    标签: sql-server odbc tcl tdbc


    【解决方案1】:

    [Microsoft][ODBC Driver 11 for SQL Server]字符串数据,对 截断

    您可能知道,此错误是由于插入的字符串比声明的列精度长。

    根据 tdbc::statement 手册,$stmt paramtype 的语法是:

    $stmt paramtype ?direction? type ?precision? ?scale?
    

    所以我不太确定在这里将f50 传递为direction 是什么意思(应该是以下之一:in, inout, out。 我认为您可以省略$stmt paramtype 调用并直接执行$insert_cmd,例如使用$stmt execute ?dict?

    set insert_cmd [db prepare {INSERT INTO dbo.testing_tdbc (f50,f100) VALUES(:f50,:f100) } ]
    
    foreach fint {1 2 3 4 5} {
       set value [expr {$fint*2}]_$fint
       set bindings [dict create f50 $value f100 $value]
       $insert_cmd execute $bindings
    }
    
    $insert_cmd close
    db close
    

    【讨论】:

    • 我尝试了Jakub建议的代码,但没有成功:
      [Microsoft][ODBC SQL Server Driver]String data, right truncation (execution the statement) while execution ":: oo::Obj22::Stmt::1 resultSetCreate ::oo::Obj23::ResultSet::1 ::oo::Obj22::Stm t::1 {f50 2_1 f100 2_1}" ("uplevel" body line 1 ) 从“uplevel 1 [list [self] resultSetCreate [namespace current]::ResultSet::[incr resultSetSeq] [self] {*}$args]”中调用(类“::tdbc::statement”方法“execute”第 2 行)从“$insert_cmd execute $bindings”中调用...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    相关资源
    最近更新 更多