はじまして。
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値を入れる方法を教えて下さい。
パラメターのDataTypeを指定して、
Parameters.ParamByName('value').Value := NULL;
でどうでしょうか?
D7の場合、NULLはVariantsに有ります。
HOtaさん、ありがとうございます。
ご指摘通り
Parameters.ParamByName('value').DataType := ftString;
Parameters.ParamByName('value').Value := NULL;
として実行しましたが、同じエラーが発生します。
with Parameters.ParamByName('value') do
Attributes := Attributes + [paNullable];
と属性でNULL可を付与しても同じ現象でした。
MS-Access側の問題なのでしょうか?
key, valueという項目の名前は予約語で、
他の名前に変えてみてください。
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(空文字)は設定出来ないのでしょうか?
下記サイトのDelphiメーリングリスト過去ログ 記事番号 49956 で
Size プロパティを指定することによって解決されていますがどうでしょうか?
http://www2.big.or.jp/~osamu/Delphi/
おかしいですね。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;
これで問題なく登録できるのですが。
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
値要求:いいえ
空文字列の許可:はい
としています。
MS-Access2000を使っています。
サイズは指定していませんが、構造は50になっていました。
フィールド名:user_name
データ型:テキスト型
フィールドサイズ:50
値要求:いいえ
空文字列の許可:いいえ <−あれ?でも問題なくできた?
ちょっと変ですが、前のコードでちゃんと動作しました。
HOtaさん
空文字列の許可:いいえ の場合、
Parameters.ParamByName('user_name').Value := NULL;
だと入って
Parameters.ParamByName('user_name').Value := '';
だとエラーになってしまうかもですね?
それにしてもサイズ指定なしでエラーにならないところを見ると
MS-Accessのバージョンによりけりなのでしょうか?
サイズを一律"255"としてやってみます。
色々ご指導ありがとうございました。
ツイート | ![]() |