TParametersにNULL値でエラー @Delphi XE2

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