2017-05-23 1 views
3

우리는 몇 년 동안 MS SQL Server에 대한 쿼리를 실행하기 위해 tclodbc 패키지를 사용 해왔다. 이제 x64 프로세스로 전환해야하며 x64 버전이 없으므로 tclodbc가로드되지 않습니다.Win x64에서 MS SQL을 통해 tdbc를 사용하여 Tcl 사용

우리는 대안을 찾기 시작했고 tdbc를 시도했지만 매개 변수로 전달 된 문자 필드에 문제가 있습니다. 나는 2 개의 정수 컬럼과 2 개의 varchar 컬럼 (50과 100 long)으로 테스트 테이블을 만들었다.

레코드를 삽입하려고하는데 다음이 발생합니다. 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 

내가 SQL Server에 대한 ODBC 드라이버 (13)와 같은 시도 :

여기 내 코드입니다.

답변

0

[Microsoft][ODBC Driver 11 for SQL Server]String data, right truncation

아마 알다시피,이 오류는 선언 된 열 정밀도보다 긴 문자열을 삽입하면 발생합니다.

tdbc :: 문 매뉴얼에 따르면 $stmt paramtype에 대한 구문은 다음과 같습니다 in, inout, out :

$stmt paramtype ?direction? type ?precision? ?scale? 

그래서 난 당신이 중 하나 여야합니다 여기 direction (로 f50을 전달하여 무슨 뜻인지 정말 모르겠습니다.

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 
: 나는 그냥 $stmt paramtype 전화를 생략하고 예를 $stmt execute ?dict?에 사용 $insert_cmd을 실행에 직접 진행할 수 있다고 생각
+0

내가 야쿱에 의해 제안 코드를 시도했지만 작동하지 않았다 :
[Microsoft] [ODBC SQL Server 드라이버] String 데이터 오른쪽 절단 (명령문을 실행) : "OO :: Obj22을 을 실행하는 동안 : : Stmt :: 1 resultSetCreate :: oo :: Obj23 :: ResultSet :: 1 :: Obj22 :: Stm t :: 1 {f50 2_1 f100 2_1} " ("상위 레벨 본문 1 ") 이 호출되었습니다. from "uplevel 1 [list [self] resultSetCreate [네임 스페이스 현재] :: ResultSet :: [incr resultSetSeq] [self] {*} $ args]" (클래스 ":: tdbc :: 문"메서드 "실행" "줄 2) 에서 호출되었습니다. "$ insert_cmd execute $ bindings "... –

관련 문제