首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Win x64上通过MS SQL使用Tcl和tdbc

在Win x64上通过MS SQL使用Tcl和tdbc
EN

Stack Overflow用户
提问于 2017-05-23 20:49:56
回答 1查看 342关注 0票数 3

几年来,我们一直在使用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类型的列)。

下面是我的代码:

代码语言:javascript
复制
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进行了同样的尝试--结果都是一样的。

EN

回答 1

Stack Overflow用户

发布于 2018-03-04 18:52:57

MicrosoftString数据,右截断

正如您可能知道的,此错误是由于插入的字符串长度超过声明的列精度而导致的。

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

代码语言:javascript
复制
$stmt paramtype ?direction? type ?precision? ?scale?

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

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44135353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档