はじめまして。
長文の質問になりますが、よろしくお願いします。
データベースから一気にデータを取ってきて
プログラム上でそのデータを加工しようと思いまして
以下のようなプログラムを書いてみました。
しかし(*)のところでエラーになってしまいます。
どこがおかしいのか教えてください。<(_ _)>
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
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;
kazu様
ありがとうございます。
”アドレスエラー”というメッセージが出ていたので
なんだろうと思っていたのですが、
>・メモリが割り当てられていない。
というのはまさにその通りみたいです。
また何かありましたら、よろしくお願いします。
解決マークを出しておきます(^^)
ツイート | ![]() |