0

アクセスする空のテーブルがあり、SQL INSERT ステートメントでデータを追加します。その後、プロシージャを使用してテーブルを調べ、ADO を使用してすべての値をオブジェクトの配列に入れます。

デバッグ後、プロシージャがテーブル内の値を見つけられず、テーブルが EOF にあり、テーブルから値を抽出していないことがわかります。

ただし、アプリケーションを終了して (プログラムを閉じて) 再度実行すると、アクセスでテーブルを「挿入」および「保存」したように見え、テーブル内の値を見つけて ADO で抽出し、それをオブジェクトの配列。

どういうわけか、デルファイを介してアクセスデータベースを「保存」する必要があります

 //inserts the new(first and following) records  
 begin
  qryVote.Active := False;
  qryVote.SQL.Text := 'insert INTO tblkandidate ([Leerder nr],Van,Naam,geboortedatum,[id nr],geslag,[sel nr],debietpunte,voogklas,deelname,stemme) VALUES ("'+leerdernr+'","'+van+'","'+naam+'",#'+gebdatum+'#,"'+idnr+'","'+geslag+'","'+selnr+'",'+inttostr(debiete)+',"'+voogklas+'","'+booltostr(bsport)+'",'+inttostr(stemme)+') ';
  qryVote.ExecSQL; 
  qryVote.SQL.Text := 'select * from tblkandidate';
  qryVote.Active := true;

  KandidateNaSkik; //procedure that goes through the table and puts every record into the array of objects (see below foe precedure)
  showmessage('Jou pesoonlike data is gestoor');
end;

procedure Tfrmvote.KandidateNaSkik;
var
    leerdernr,naam,van,idnr,selnr,voogklas,gebdatum,geslag : STRING;
    stemme, debiete: integer;
    bsport, gestem : boolean;
begin

frmvote.ADOTableVotek.open;

 with dbgviewp.DataSource.DataSet do
 begin
   frmvote.ADOTableVotek.first;

   iaantkan :=0;

   while not frmvote.ADOTableVotek.EOF do    
   begin

   inc(iaantkan);
   leerdernr := frmvote.ADOTableVotek['LEERDER NR']; 
   van := frmvote.ADOTableVotek['VAN'];
   naam := frmvote.ADOTableVotek['NAAM'];
   gebdatum := frmvote.ADOTableVotek['geboortedatum'];
   idnr := frmvote.ADOTableVotek['id nr'];
   geslag := frmvote.ADOTableVotek['geslag'];
   selnr := frmvote.ADOTableVotek['sel nr'];
   debiete := frmvote.ADOTableVotek['debietpunte'];
   voogklas := frmvote.ADOTableVotek['voogklas'];
   bsport := frmvote.ADOTableVotek['deelname'];
   stemme := frmvote.ADOTableVotek['stemme'];
   gestem := frmvote.ADOTableVotek['gestem'];

   //the above variables get sent to the array below

   arrkandidaat[iaantkan] := tVerkiesing.create(leerdernr, van, naam, 
        gebdatum,idnr,geslag,selnr,debiete,voogklas,bsport,gestem,stemme);

   frmvote.ADOTableVotek.Next;
end;{while}

end;{with}

end;
4

2 に答える 2

3

を介してレコードを挿入するためqryVote.ExecSQLADOTableVotekデータセットは新しいレコードが DB に追加されたことを「認識」しないため、次のいずれかを呼び出します。

frmvote.ADOTableVotek.Requery;

例えば:

procedure Tfrmvote.KandidateNaSkik;
begin
  ...
  if not frmvote.ADOTableVotek.Active then
    frmvote.ADOTableVotek.Open
  else
    frmvote.ADOTableVotek.Requery;
  ...
end;

ADOTableVotekまたは、次のようにそれ自体を介して新しいレコードを追加します。

 ADOTableVotek.Append; // add new record
 ADOTableVotek.FieldByName('Leerder nr').AsString := leerdernr;
 // ADOTableVotek.FieldByName('etc..')...
 // etc...
 ADOTableVotek.Post; // post new record to the DB

変更はすぐに と に反映さADOTableVotekれますdbgviewp
このようにして、ADOTableVotekを常にアクティブにすることができます。1 回だけ呼び出す必要がありますADOTableVotek.Open(または set ADOTableVotek.Active := True)。また、新しいレコードを挿入するたびに DB からすべてのレコードを取得する必要はありません。

于 2013-10-17T19:05:56.420 に答える
1

変更を反映するには、次のようにデータセットを閉じてから再度開いてみてください

frmvote.ADOTableVotek.Close;
frmvote.ADOTableVotek.Open;
于 2013-10-17T16:56:48.887 に答える