tcl tdbc::odbc包和向查询传递参数

tcl tdbc::odbc包和向查询传递参数,tcl,tdbc,Tcl,Tdbc,这是我第一次尝试使用tdbc包ODBC连接,我不知道如何将参数传递到查询中。代码如下: set dsnName dsn1 set username user1 set password xxxxx set connStr "DSN=$dsnName; UID=$username; PWD=$password;" tdbc::odbc::connection create db $connStr set rows [db allrows {SELECT DISTINCT [Address] FR

这是我第一次尝试使用tdbc包ODBC连接,我不知道如何将参数传递到查询中。代码如下:

set dsnName dsn1
set username user1
set password xxxxx
set connStr "DSN=$dsnName; UID=$username; PWD=$password;"
tdbc::odbc::connection create db $connStr

set rows [db allrows {SELECT DISTINCT [Address] FROM [Customers] WHERE [Apt Number]='3-b'}]
这是有效的。但是,我想将“3-b”传递给查询。所以我试着:

set queryValues [dict create apt 3-b]
set rows [db allrows {SELECT DISTINCT [Address] FROM [Customers] WHERE [Apt Number]=':apt'} $queryValues]
但这给了我一个错误[Microsoft][ODBC SQL Server驱动程序]字符串数据、右截断或类似的错误。 我尝试了不同的格式,但没有任何效果。我做错了什么

根据格伦的回答,我还尝试:

set stmt [db prepare {SELECT DISTINCT [Address] FROM [Customers] WHERE [Apt Number]=:apt}]
set params [dict create apt "3-b"]
set rows [$stmt allrows $params]
相同错误[1][Microsoft][ODBC SQL Server驱动程序]字符串数据,右截断

但这是可行的

 set stmt [db prepare {SELECT DISTINCT [Address] FROM [Customers] WHERE [Apt Number]='3-b'}]
set rows [$stmt allrows]
我还必须补充一点,tclobc包在这里工作得很好。请参见下面的代码

package require tclodbc
#<connect to database>
#query
set aptNo "3-b"
set query "SELECT DISTINCT \[Address\] FROM \[Customers\] WHERE \[Apt Number\]=?"
set dbResult [$dbConn $query [list $aptNo]]
在tclobc包中工作正常,但在tdbc包中类似的代码失败

-Suresh

您需要使用

或者您可以创建一个apt局部变量:

set apt "3-b"
set rows [$stmt allrows]

谢谢Glenn,但准备好的声明也给出了相同的错误:。这是数据库里的东西吗?这是SQLdatabase@Suresh,为什么您如此确定您的输入数据适合目标列?当SQL Server告诉您您的数据将被截断时,这意味着您(比如)提交了一个长度为50的字符串以匹配长度为30的列。@Suresh,现在发生这种情况的原因可能不同,包括不正确的字符集转换,例如以某种方式直接将包含非ASCII字符的UTF-8编码字符串传递给SQL Server。总而言之,我将从安装SQL Server Profiler开始,在这里开始跟踪并捕获应用程序和服务器的交换。另一种方法是使用Microsoft Network Monitor捕获在线流量,它的解析器支持MS-TDS协议。Wireshark也可以。地址列的定义是什么?@Donal,它是varchar255
set apt "3-b"
set rows [$stmt allrows]