現在、delphi4のservice pack3のデータベースoracle 8iを使っています。INSERTやupdate処理のプログラムを組む際、データベース上の項目がnumber(数値)型があるのですが、params用の変数をintegerに設定し、strToIntをつかって入力スペース(TEDit)を方を返還、そしてparams[0].AsiInteger := 設定した変数としても、変数の型が合わないというエラーが出てしまします。ただ、変数をstring型にして、そのまま型をプログラム上で変換せずにプログラムを組むとエラーはでません。
データベース上のテーブルの型が数値型なので、このままstringで作業していくとなにかしらのエラーが出るような気がするのですが、アドバイスをいただけないでしょうか?
Params[0].AsInteger := StrToIntDef(Edit1.text,0);
としてもエラーになるのなら、Params[0]の設定がおかしいのでしょう。
SQL文の設定がどのようになっているか、提示していただけませんでしょうか?
Delphiはこのあたりの型の検査が厳しいので、注意が必要です。
Params[0].AsInteger := StrToIntDef(Edit1.text,0);
とパラメータの順番で指定するより
ParamByName('SUUTI').AsInteger := StrToIntDef(Edit1.text,0);
のように、パラメータ名で指定した方が、
Queryを書き換えた時などで、パラメータの順番が変わったとでも
対応できて安全ですよ。
以下のように書いています。
var
i1 : integer;
i2 : integer;
s1 : string;
begin
i1 := StrToInt(pID.Text);
i2 := StrToInt(pKINGAKU.Text);
s1 := pNAME.Text;
with query1 do
close;
with sql do;
begin
clear;
add('select * from tableA');
add('where ID = :value1 and KINGAKU = :value2 and NAME= :value3'); ←このでは、改行されてますが、プログラム上では横につながっています。
prepare;
params[0].AsInteger := i1;
params[1].AsInteger := i2;
params[2].AsInteger := s1;
end;
open;
end;
integerの変数を1つだけ使うときは、うまく機能します。しから、上記のように2つ以上使うと、型が違うなどのエラーが出てしまいます。
ちなみに、データベース上のテーブルの項目がINT型で、それを無視してdelphi上で、すべてstring型で扱うと、エラーが生じるのでしょうか?今は、すべてstringでやっており、エラーはでてないです。
よろしくお願いします。
パラメターを使うとOracleの型と合わさなければいけません。
ID,KINGAKU,NAMEのOracleの型と違っているのではないでしょうか?
KINGAKUはCurrencyとか、NAMEは文字列方とかではないでしょうか?
それでしたら、
> params[0].AsInteger := i1;
> params[1].AsInteger := i2;
> params[2].AsInteger := s1;
var
i2 : Currency;
s1 : String;
ParamByName('value2').Ascurrency := i2;
ParamByName('value3').AsString := s1;
どうでしょうか?
解決いたしました。HOtaさん、GTRさん、どうもありがとうございました。
ツイート | ![]() |