SQLServer C# データ挿入時に文字列長に関するエラーが発生した

こんにちは、kisseです。

最近C#を使って、SQLServerへのデータ読み書きを行うプログラムを書いたりしています。
その際に、検索しても解決策があまり出てこないエラーメッセージが出てきて困ったので、僕の場合の問題と解決方法を書きます。
(そもそもSQLServer使ってる人いないから記事があまりない説)




問題の発端

何気なくデータの挿入しようと、プログラム書いて実行したらこんなエラーが。

BCP クライアントから受信した colid [数字] の列の長さが無効です。

ちなみに言語設定が英語だと、

Received an invalid column length from the bcp client for colid [数字]

になるようです。

この時、Bulk Insertを行おうとしていました。
列の長さが無効??
意味がわかりませんでした。

検索しても具体的な解決策が出てこなかったので、自力で解決を目指します。

問題の原因究明

とりあえず、デバッグ実行で挿入データの形式を確認しましたが、問題は見つからず。

その後、挿入データの形式がテーブルの制約に引っかかっているのではないかと思い、テーブルスキーマを見ました。
しかし、主キー違反等は確認できず。(主キー違反なら別のエラー出るし。)

colidとして指定されている列を見に行っても、そこはnull許可の列にnullを格納しようとしているだけでした。
しかし、ふと「colidの最初の値って0なのか??」となぜか思い、1スタートで数えてみた列を見に行ったら問題を見つけました。

テーブルスキーマにはvarchar(10)と定義されていたのですが、挿入しようとしていたデータは11文字でした。
colidは1スタートなのかよ。

解決策

この場合、

  • テーブルスキーマを変更する
  • 挿入文字列の変更

の2択になります。

今回は挿入文字列の変更で対応しました。




おわり

普段0スタートのインデックスに慣れすぎたせいで余計にデバッグに時間がかかってしまいました。
(というか0スタートに統一してほしかった。。)

冒頭に紹介したエラーメッセージが出た方は、挿入したいデータが、テーブルスキーマの定義に違反していないかチェックしましょう!(特に文字列の挿入の場合)

最後まで読んで頂き、ありがとうございます!

あわせて読みたい