Delphi

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つの解決方法だったと思われるが、
今は通用しないようだ。

-

ファイルをドラッグアンドドロップ @Delphi

バーコードを読み込ませるため、
都度都度スキャナで読み込むのは、面倒なので、
保存済みの画像を、ドラッグ&ドロップ(以下D&D)で、
処理できるようにした。


そのような、サンプルソースは、たくさんあるので、

今回は、これらを元に、実装した。

たしか、コンポーネントもあったはずだけど。

 

いずれも同じコードなので、詳細は、上記を見てもらうとして、

D&Dすると、エラーが出る・・・・
最小限の単独アプリにしても、エラーが出る。

具体的には、メモリーのアクセス違反になる。

※環境は、10.2 Tokyoが出ているにもかかわらず、XE2 !!(笑

***

エラー箇所は、D&Dした直後ではなく、画像を読取った後、
別のコンポーネントにAssignする時など、いつも同じ箇所で起きるわけでもなく、

手を変え品を変え、いろいろやってみたけど、まさかと思ったこのコード↓

//pFilenameに上で得たサイズ分のメモリを確保
pFilename := AllocMem(DropCount);

このPcharに動的に領域を割り当てようとする、この手続きだけど、

 

まさかと思ったけど、まさかだった!!

 

pFileName: PChar;

の宣言を、

pFileName: Array[0..MAX_PATH] of Char; // 固定長 = 260

に。

当然、動的に確保するAllocMem・FreeMemの手続きは、削除した結果、

 

 

エラーが、一切出ない!!

治った・・・?!

 

Unicode体系になったからだろうか?
文字の長さ(=byte)違うのが、原因だろうか?

わからないけど、

ちょっとくらいのメモリー、ケチったたところで、
このご時世じゃ、なんちゃーないわえ!(なんでもない@高知弁(草

-