データを一気に取得するには?

解決


ソロ  2002-08-28 02:32:49  No: 1370

はじめまして。
長文の質問になりますが、よろしくお願いします。

データベースから一気にデータを取ってきて
プログラム上でそのデータを加工しようと思いまして
以下のようなプログラムを書いてみました。

しかし(*)のところでエラーになってしまいます。
どこがおかしいのか教えてください。<(_  _)>

procedure TForm1.Button1Click(Sender: TObject);
var
 txtSQL: String;
 i : integer;
 DBData: array of string;

begin

 /DBオープン
 SDB.Open();

 begin

  //一気にデータを取ってくる
  txtSQL := '';
  txtSQL := 'SELECT AAA '+
            'FROM   BBB ';

  //SQL発行
  dbs := SDB.getResultSet(txtSQL);
  dbs.MoveFirst;

  //★書き込む処理を記述★
  while not dbs.EOF do
   begin
    DBData[i] := dbs.Fields['AAA'].Value;(*)
    dbs.MoveNext
   end;

 end;

 //データベースクローズ
 SDB.Close();
 EXIT;
     
end;

unit DBAccessClass;

interface

type
  TDB = class(TObject)

  public
    function getResultSet(sql_str: String): variant;
  end;

var
  SDB             : TDB;
  objOraSession   : variant; {セッションオブジェクト}
  objOraDatabase  : variant; {データベースオブジェクト}
  objOraDynaset   : variant; {ダイナセットオブジェクト}

implementation

uses ComObj;

//SQL 文を実行した結果の ResultSet を返す
//引数 sql文(String型)

function TDB.getResultSet(sql_str: String): variant;
begin
  if not VarIsNull(objOraDatabase.dbCreateDynaset[sql_str,$0]) then
    begin
      objOraDynaset   :=  objOraDatabase.dbCreateDynaset[sql_str,$0];
      Result := objOraDynaset;
    end
  else
    begin
      objOraDynaset := null;
      Result := objOraDynaset;
    end;
end;

end


kazu  2002-08-28 03:40:20  No: 1371

DBDataは動的配列ですよね?
ソースがこの通りなら、下の2つに注意してください。
・メモリが割り当てられていない。
・iが初期化されていない。
//★書き込む処理を記述★
  i := 0;
  while not dbs.EOF do
   begin    
    SetLength(DBData, i+1);
    DBData[i] := dbs.Fields['AAA'].Value;(*)
    dbs.MoveNext
    Inc(i);
   end;


ソロ  2002-08-28 04:19:03  No: 1372

kazu様

ありがとうございます。
”アドレスエラー”というメッセージが出ていたので
なんだろうと思っていたのですが、

>・メモリが割り当てられていない。

というのはまさにその通りみたいです。

また何かありましたら、よろしくお願いします。


ソロ  2002-09-06 23:37:24  No: 1373

解決マークを出しておきます(^^)


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








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