.log

miscellaneous memorandum

「着信の表形式のデータ ストリーム (TDS) リモート プロシージャ コール (RPC) プロトコル ストリームが不適切です。パラメーター 3(""): データ型 0xE7 に、無効なデータ長またはメタデータ長が指定されています。(#8016)」

October 21, 2011

もう、ぱっとみて何が言いたいのかひとっつもわからない、というか出た瞬間に読むのをあきらめたくなる典型的なメッセージですね。

これは、AccessからODBC経由で、nvarchar(max)のフィールドにnullを入れようとしたときに出るエラーメッセージです。 一応環境を書いておきましょう。

  • SQLServer 2008 Express (Microsoft SQL Server 2008 (SP2) - 10.0.4000.0 (Intel X86) Sep 16 2010 20:09:22 Copyright © 1988-2008 Microsoft Corporation Express Edition on Windows NT 6.0 (Build 6001: Service Pack 1) )
  • SQL Server Native Client 10.0
  • Microsoft Access 2010 (14.0.5128.5000) SQLServer上の、nvarchar(max)型のフィールドを含むテーブルを、AccessからODBCでリンク。 フォームなり、テーブルのデータシートビューから、「すでにnvarchar(max)型のフィールドに含まれる値を削除して更新しようとする」と発生します。 (新規追加時にnvarchar(max)型フィールドに何も入力しなければ出ません。nvarchar(max)型のフィールドがnullを許容する設定になっていても関係ありません)

AccessまたはSQL Server Native Client側で、nullで更新しようとしたときのデータ長が、SQL Server側で受け入れてもらえない内容になっているんでしょう。 理由が想像できても解決方法がわかりません。 とりあえず、このケースに対しては、更新がかかる前までにnullではなく”“をセットするぐらいしかない……

文字列が入るフィールドに、nullと”“が混在するのは美しくないですね。 「値が入っていないもの」という抽出が2つの値を対象にしなければなりません。 まあ、自分だけで触っているぶんにはいいんですが、後から別の人が触るときには余計な混乱を引き起こすかもしれません。

nvarchar(max)をやめて、nvarchar(8000)までの方に変えてやればよいのかもしれませんが、せっかくmaxがあるのに、エラー回避のためだけにそういう修正をするのもなんか気にくわない感じがします(まあ、一応検証はしてみますが)。 事務系のゆるい処理をする場合、あまり重要ではないデータ(備考とかメモとか)に色々制限をつけると手間かかりますからね。

回避する方法などを探してはいますが、なにしろググるキーワードがこのエラーメッセージですからね。 もうめんどくさいことこの上ないわけです。

Accessは、データを処理するフロント側のシステムとしては非常に便利で、特に事務処理系なら皆まで言わずに色々やってくれるので助かりますが、ODBCがいけてないのが困りもの。リンクテーブルをやめてコードで書くぐらいなら最初からAccessじゃなくてC#とかで書いた方が素直。今更AccessのVBAで大量のコードを書きたくない、次のAccessは.net系でコードが書けるようにならんかなぁ。

まあ、ともかく、解決策は引き続き探すものの、当座の回避策を決めないとね……