2017-05-23 16 views
3

MS SQL Serverに対するクエリを数年間実行するためにtclodbcパッケージを使用してきました。今はx64プロセスに切り替える必要があり、x64バージョンがないためtclodbcはロードされません。Tclを使用してTclを使用してWin x64上でMS SQLを使用する

代替案を調べ始めてtdbcを試しましたが、パラメータとして渡される文字フィールドに問題があります。私は2つの整数列と2つのvarchar列(50と100の長さ)を持つテストテーブルを作成しました。

私はレコードを挿入しようとしていますが、次のようになります。 1. 2つの整数パラメータのみを提供するレコードを挿入すると、5つのレコードが挿入されます(下のコードを参照)。 2. 1文字のみのパラメータを指定してレコードを挿入すると、レコードが挿入され、「SQL Server用のMicrosoft [ODBCドライバ11]文字列データ、右切り捨て」というエラーメッセージが表示され、スクリプトが失敗します。 3. 2つの文字パラメータ、または整数パラメータと文字パラメータは何も挿入されません - 私は上記と同じエラーが発生します。

他のデータ型はテストしませんでしたが、文字パラメータに問題があるようです(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を渡すことで、何を意味するのか本当にわかりません。 私はあなただけ $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 close 
+0

私はヤクブによって提案されたコードを試してみましたが、それはうまくいきませんでした:
(ステートメントを実行)[Microsoft]の[ODBC SQL Serverドライバー]文字列データ、右切り捨て 実行中に、「:: 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 [namespace current] :: ResultSet :: [incr resultSetSeq] [self] {*} $ args]" (クラス ":: tdbc ::ステートメント"メソッド "execute" "行2) は、 から呼び出されます。" $ insert_cmd execute $ bindings "... –

関連する問題