2013-10-17 65 views
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; 
+0

非常感谢!像一个魅力 –

+1

工作,你说这个答案?如果它对你有帮助,你应该'接受'。 – kobik

回答

1

为了反映更改尝试关闭并重新打开数据集,像这样

frmvote.ADOTableVotek.Close; 
frmvote.ADOTableVotek.Open; 
3

既然你插入通过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 

的变化将反映到imedeatlly和ADOTableVotekdbgviewp
这样ADOTableVotek可以始终处于活动状态。您只需拨打ADOTableVotek.Open一次(或设置ADOTableVotek.Active := True)。每次插入新记录时,都不需要从数据库中提取所有记录。

相关问题