ADOでパラメータに空文字

解決


KMT  2005-04-20 22:52:26  No: 14393

はじまして。
Delphi7 EntでADOを使用してデータアクセスしています。
データベースはMS-Access2002(XP)です。

with ADOQuery1 do
begin
  SQL.Clear;
  SQL.Add('INSERT INTO test_table');
  SQL.Add('(key, value)');
  SQL.Add('VALUES');
  SQL.Add('(:key, :value)');

  Parameters.FindParam('key').Value := 'AAA';
  Parameters.FindParam('value').Value := '';  //空文字を指定
  
  ExecSQL;
end;

でデータを追加しようとしたところ
[Microsoft][ODBC Microsoft Access Driver]有効桁数の値が無効です。
と言うエラーが出ます。

フィールド"value"は値要求を"いいえ"としてNULL可にしております。
因みにパラメータ"value"に値を入れると追加出来るのですが、NULL値の追加もしたいと思っております。
パラメータにNULL値を入れる方法を教えて下さい。


HOta  2005-04-20 23:54:25  No: 14394

パラメターのDataTypeを指定して、
Parameters.ParamByName('value').Value := NULL;
でどうでしょうか?
D7の場合、NULLはVariantsに有ります。


KMT  2005-04-21 03:15:53  No: 14395

HOtaさん、ありがとうございます。

ご指摘通り
Parameters.ParamByName('value').DataType := ftString;
Parameters.ParamByName('value').Value := NULL;

として実行しましたが、同じエラーが発生します。

with Parameters.ParamByName('value') do
  Attributes := Attributes + [paNullable];

と属性でNULL可を付与しても同じ現象でした。
MS-Access側の問題なのでしょうか?


HOta  2005-04-21 06:47:15  No: 14396

key, valueという項目の名前は予約語で、
他の名前に変えてみてください。


KMT  2005-04-21 19:01:03  No: 14397

HOtaさん、度々ありがとうございます。

with Parameters.ParamByName('user_id')do
begin
  DataType := ftString;
  Value := 'AAA';
end;
with Parameters.ParamByName('user_name') do
begin
  DataType := ftString;
  Value := NULL;
end;

上記の様にフィールド名を変えてみましたが、同じエラーでした。
DataTypeを指定しなかった場合は

Parameterオブジェクトが適切に定義されていません。矛盾した、または不完全な情報が提供されました。

と言うエラーになります。

ADOではデータにNULL(空文字)は設定出来ないのでしょうか?


Basser  2005-04-21 20:14:56  No: 14398

下記サイトのDelphiメーリングリスト過去ログ 記事番号 49956 で
Size プロパティを指定することによって解決されていますがどうでしょうか?

http://www2.big.or.jp/~osamu/Delphi/


HOta  2005-04-21 23:44:16  No: 14399

おかしいですね。AccessでKeyA,AAAAAの2つの項目を持つテーブルを作って
同じ名前のパラメターにして、試してみました。

  with ADOQuery2 do
  begin
    Close;
    Parameters.ParamByName('KeyA').Value      := Edit1.Text;
    Parameters.ParamByName('AAAAA').DataType  := ftString;
    Parameters.ParamByName('AAAAA').Value := NULL;
    ExecSQL;
  end;
これで問題なく登録できるのですが。


KMT  2005-04-22 00:40:22  No: 14400

Basserさん、HOtaさん、ありがとうございます。

Basserさんの言われたメーリングリストに同じ質問がありました。
このサイトも調べたのですが、過去ログまでは検索してませんでした、すみません。

with Parameters.ParamByName('user_name') do
begin
  DataType := ftString;
  Size := 255;
  Value := NULL;
end;

としましたら、データ挿入出来ました。

しかし、HOtaさんはサイズを指定しなくてもNULL値を入れられたみたいですね?

私はMS-Access2002(XP)でNULL値を入れたい項目は
フィールド名:user_name
データ型:テキスト型
フィールドサイズ:255
値要求:いいえ
空文字列の許可:はい

としています。


HOta  2005-04-22 01:13:06  No: 14401

MS-Access2000を使っています。
サイズは指定していませんが、構造は50になっていました。

フィールド名:user_name
データ型:テキスト型
フィールドサイズ:50
値要求:いいえ
空文字列の許可:いいえ  <−あれ?でも問題なくできた?

ちょっと変ですが、前のコードでちゃんと動作しました。


KMT  2005-04-22 02:45:45  No: 14402

HOtaさん

空文字列の許可:いいえ  の場合、
Parameters.ParamByName('user_name').Value := NULL;
だと入って
Parameters.ParamByName('user_name').Value := '';
だとエラーになってしまうかもですね?

それにしてもサイズ指定なしでエラーにならないところを見ると
MS-Accessのバージョンによりけりなのでしょうか?

サイズを一律"255"としてやってみます。
色々ご指導ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加