几年来,我们一直在使用tclodbc包对MS SQL Server运行查询。现在我们必须切换到x64进程,tclodbc不会加载,因为没有x64版本。
我们开始寻找替代方法,并尝试tdbc,但我们在将字符字段作为参数传递时遇到了问题。我创建了一个包含2个整型列和2个varchar列(50和100长)的测试表。
我正在尝试插入记录,并且发生了以下情况: 1.如果我插入的记录只提供了2个整型参数,一切正常--插入了5条记录(见下面的代码)。2.如果我插入的记录只提供了一个字符参数1个记录被插入,然后脚本失败并出现以下错误:"MicrosoftString 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我用ODBC Driver 13 for SQL Server进行了同样的尝试--结果都是一样的。
发布于 2018-03-04 18:52:57
MicrosoftString数据,右截断
正如您可能知道的,此错误是由于插入的字符串长度超过声明的列精度而导致的。
根据tdbc::语句手册,$stmt paramtype的语法是:
$stmt paramtype ?direction? type ?precision? ?scale?因此,我不太确定您在这里将f50作为direction传递是什么意思(应该是:in, inout, out。我认为您可以省略$stmt paramtype调用,直接使用例如$stmt execute ?dict?执行$insert_cmd
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 closehttps://stackoverflow.com/questions/44135353
复制相似问题