在Win x64上使用Tcl和tdbc而不是MS SQL

问题描述 投票:3回答:1

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

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

我试图插入记录,并发生以下情况:1。如果我插入只提供2个整数参数的记录一切正常 - 插入5条记录(见下面的代码)。 2.如果我插入只提供1个字符参数的记录1插入记录,然后脚本失败并出现以下错误:“[Microsoft] [SQL Server的ODBC驱动程序11]字符串数据,右截断”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

我尝试使用ODBC驱动程序13 for SQL Server - 所有结果都相同。

sql-server odbc tcl
1个回答
0
投票

[Microsoft] [SQL Server的ODBC驱动程序11]字符串数据,右截断

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

根据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
© www.soinside.com 2019 - 2024. All rights reserved.