如何在插入第一条记录并将其添加到对象数组后“保存”表?
Posted
技术标签:
【中文标题】如何在插入第一条记录并将其添加到对象数组后“保存”表?【英文标题】:How to get a table "saved" after INSERTING the first record and adding it to an ARRAY of objects? 【发布时间】:2013-10-17 15:01:20 【问题描述】:我在访问中有一个空表,并使用 SQL INSERT 语句添加数据。在我使用过程遍历表并使用 ADO 将所有值放入对象数组之后。
调试后,我可以看到该过程在表中找不到任何值,并说该表位于 EOF 并且没有从表中提取任何值。
但是,如果我终止我的应用程序(关闭程序)并再次运行它,它似乎已经“插入”并“保存”了访问中的表,然后确实在表中找到值并使用 ADO 提取它,然后插入将其放入对象数组中。
不知何故我需要通过delphi“保存”访问数据库
//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;
【问题讨论】:
谢谢一百万!!像魅力一样工作 您参考了哪个答案?如果它对你有帮助,你应该accept
它。
【参考方案1】:
由于您通过qryVote.ExecSQL
插入记录,ADOTableVotek
数据集并不“知道”新记录已添加到数据库中,因此您可以调用:
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
可以始终处于活动状态。您只需调用一次ADOTableVotek.Open
(或设置ADOTableVotek.Active := True
)。而且您无需在每次插入新记录时都从数据库中获取所有记录。
【讨论】:
【参考方案2】:为了反映更改,请尝试关闭并重新打开数据集,像这样
frmvote.ADOTableVotek.Close;
frmvote.ADOTableVotek.Open;
【讨论】:
以上是关于如何在插入第一条记录并将其添加到对象数组后“保存”表?的主要内容,如果未能解决你的问题,请参考以下文章