3421 adErrDataConversion
アプリケーションが、現在の操作に対して間違った型の値を使用しています。たとえば、ストリームを使用する操作に文字列を指定した可能性があります。
という、エラーが発生。
今回、備考で使用していたftMemoFieldも同様のエラーが発生し、
ftWideMemoに変更してみたり、
SQLServerの型も、text >> nvarchar(MAX)に置き換えたりしたが、
だめだった・・・
ひとまずコメントアウトしてみたが、別の項目でもエラーが発生する。
大昔に悪銭苦闘し、
Param.Size := Field.Size; if (Field is TBlobField) then begin with Field do DebugPrint(FieldName + ': ' + Value + '/' + NewValue + '/' + OldValue); // blob #274 Param.Size := (Field as TBlobField).BlobSize; end; if Param.Size <= 0 then Param.Size := 1; if VarIsNull(Value) then if not (Param.DataType in [ftCurrency]) then Param.DataType := ftString;
こんなコードを記述して、TParameterを使用して、NULL値を、
Insert/Update文で、SQLServerに値を挿入していたが、
時が経過し、このコードが通用しなくなったようだ。
***
ParamByName('ID_TEST_2').DataType := ftInteger; ParamByName('ID_TEST_2').Clear; ParamByName('ID_TEST_2').Bound := True;
※https://stackoverflow.com/questions/23269537/delphi-xe2-how-to-pass-a-field-with-null-value
というコードで、NULLが代入できるようだが、
Clearも、Boundも定義されていない。。。@Delphi XE2
今回発生したのは、Int型。
上記、コードを見直してみると、文字列に対しての処理は問題ないが、
Int型、text型に対しては、処理出来ていない・・・
ということで、
if VarIsNull(Value) then Param.DataType := Field.DataType;
と、NULLのときは、元の型を渡してやるだけでよかった。
if Param.Size <= 0 then Param.Size := 1;
は、意味のある1つの解決方法だったと思われるが、
今は通用しないようだ。
TParametersにNULL値でエラー @Delphi XE2