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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Win x64上使用Tcl和tdbc而不是MS SQL相关的知识,希望对你有一定的参考价值。

几年来,我们一直在使用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 - 所有结果都相同。

答案

[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

以上是关于在Win x64上使用Tcl和tdbc而不是MS SQL的主要内容,如果未能解决你的问题,请参考以下文章

visual studio 2008有64位的吗?我win 7 x64系统,怎么装 vs2008

QT 5.6.1 应用程序在退出插槽后仅在 x86 架构而不是 x64 上崩溃

在 32 位 win7 上部署 Qt 应用程序 - 在 Win7 x64 上工作(和编译)

Win7 x64 Vad遍历模块

Win2K8 服务器(不是 R2)x64、VS2008 SP1 中没有 ASP.NET 控制智能感知

在 Win8 x64 上使用 Sql Compact CE 的 Windows Mobile