あまりに悩んで無駄な時間をすごしたので自分のメモ。
まあいわゆるハマリというやつですね。
ADOQueryなどでSQL ServerへInsertした場合に
[Microsoft][ODBC SQL Server Driver]文字列データの右側が切り捨てられました
というエラーが出るときがあります。
まあそのままの意味でデータに対してフィールドの容量が足りない場合に出る場合がほとんどなのですが、ややこしいことにまったく同じメッセージで別の内容の場合があります。
今回はこれでハマリました。
実は状況(というかこの状況自体、どういった条件で発生するのかも不明なのですが)によっては「テーブルに書き込み権限が不足している」場合に発生します。
わかってしまえばケアレスミスなのですが、メッセージの意味どおりにデバッグしていくと絶対に答えにたどり着きません!!
テーブルを作り直したり投入データを変えたりSQLを変えたり数時間・・・
さらにSQL Server Enterprise Managerからでは普通に投入できる・・・
(考えてみればManagerはスーパーユーザで動いているから当たり前で。しかし頭が大混乱状態のときは思いもつかないものです・・・)
あまりに謎なのでそれまではQueryのSQLにパラメタ形式で代入していたのですが、ベタのSQLに切り替えてみました。
INSERT INTO table1 (d1, d2, d3) VALUES (:v1, :v2, :v3)
を
Format('INSERT INTO table1 (d1, d2, d3) VALUES (%s, %s, %s)',[...]);
にしました。
すると・・・
なんとメッセージが
EOLEException
[Microsoft][ODBC SQL Server Driver] Insert権限は、オブジェクト'table1'、データベース 'db'、所有者 'dbo'にありません
と変わってるじゃないか!?
なんたること!
3時間は無駄にした!
つかれたので休憩~~~(泣)



「読む・書く・話す」を一瞬でモノにする技術


コメントする