データベース上の方とparamsの方について

解決


りな  2010-01-06 07:27:37  No: 36741

現在、delphi4のservice pack3のデータベースoracle 8iを使っています。INSERTやupdate処理のプログラムを組む際、データベース上の項目がnumber(数値)型があるのですが、params用の変数をintegerに設定し、strToIntをつかって入力スペース(TEDit)を方を返還、そしてparams[0].AsiInteger := 設定した変数としても、変数の型が合わないというエラーが出てしまします。ただ、変数をstring型にして、そのまま型をプログラム上で変換せずにプログラムを組むとエラーはでません。

データベース上のテーブルの型が数値型なので、このままstringで作業していくとなにかしらのエラーが出るような気がするのですが、アドバイスをいただけないでしょうか?


HOta  2010-01-06 20:28:57  No: 36742

Params[0].AsInteger := StrToIntDef(Edit1.text,0);
としてもエラーになるのなら、Params[0]の設定がおかしいのでしょう。
SQL文の設定がどのようになっているか、提示していただけませんでしょうか?
Delphiはこのあたりの型の検査が厳しいので、注意が必要です。


GTR  2010-01-06 22:18:45  No: 36743

Params[0].AsInteger := StrToIntDef(Edit1.text,0);
とパラメータの順番で指定するより
ParamByName('SUUTI').AsInteger := StrToIntDef(Edit1.text,0);
のように、パラメータ名で指定した方が、
Queryを書き換えた時などで、パラメータの順番が変わったとでも
対応できて安全ですよ。


りな  2010-01-08 08:22:19  No: 36744

以下のように書いています。

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でやっており、エラーはでてないです。

よろしくお願いします。


HOta  2010-01-08 17:32:41  No: 36745

パラメターを使うと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;
どうでしょうか?


りな  2010-01-09 22:43:04  No: 36746

解決いたしました。HOtaさん、GTRさん、どうもありがとうございました。


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

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






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