我正在使用ADO读取一个Access数据库,并将数据复制到具有相同结构的另一个数据库。我的问题是,有时,它不会插入文件的末尾。
DM1.ADOConnectionReadAccess.ConnectionString :=
'Provider=Microsoft.Jet.OLEDB.4.0;' + 'User ID=Admin;' +
'Data Source=' + Directory + 'Courbe\Courbe Actuel.mdb' + ';' +
'Mode=Share Deny None;Extended Properties="";' + 'Jet OLEDB:Engine Type=5;';
DM1.ADOConnectionReadAccess.Connected := true;
DM1.ADODataSetReadAccess.CommandText := 'select * from Courbe_Reservoir order by DateHeure';
DM1.ADODataSetReadAccess.Active := true;
所以我读了我的数据库并按DateTime订购。现在,当我将数据复制到新数据库时,我必须对数据进行一些更改。
DM1.ADOConnectionCopyExcel.ConnectionString :=
'Provider=Microsoft.Jet.OLEDB.4.0;' +
'User ID=Admin;' +
'Data Source=' + Directory + 'Courbe\Part of curve.mdb' + ';' +
'Mode=Share Deny None;Extended Properties="";' +
'Jet OLEDB:Engine Type=5;';
DM1.ADOConnectionCopyExcel.Connected := true;
while not DM1.ADODataSetReadAccess.Eof do
begin
Date2 := DM1.ADODataSetReadAccess.FieldByName('DateHeure').AsDateTime;
DernierDebit := DernierDebit + DM1.ADODataSetReadAccess.FieldByName('DebitRes').AsFloat / 1000;
DM1.ADOCommandCopyExcel.CommandText :=
'INSERT INTO Courbe_Reservoir' + ' VALUES (:DateHeure1, ' +
':Niveau, ' + //niveau
':DebitRes, ' + //débit entrée
':PH, ' + //ph
':Chlore, ' + //Chlore
':Turbidite, ' + //Turbidité
':Temp, ' + //température
'0, ' + //Consommation l/min
'0, ' + //Log
':DernierDebit, ' + //Consommation journalière
'0, 0, 0, '''', '''', ''''' + ')';
DM1.ADOCommandCopyExcel.Parameters.ParamByName('DateHeure1').Value := Date1;
DM1.ADOCommandCopyExcel.Parameters.ParamByName('Niveau').Value := DM1.ADODataSetReadAccess.FieldByName('Niveau').AsFloat;
DM1.ADOCommandCopyExcel.Parameters.ParamByName('DebitRes').Value := DM1.ADODataSetReadAccess.FieldByName('DebitRes').AsFloat;
DM1.ADOCommandCopyExcel.Parameters.ParamByName('PH').Value := DM1.ADODataSetReadAccess.FieldByName('PH').AsFloat;
DM1.ADOCommandCopyExcel.Parameters.ParamByName('Chlore').Value := DM1.ADODataSetReadAccess.FieldByName('Chlore').AsFloat;
DM1.ADOCommandCopyExcel.Parameters.ParamByName('Turbidite').Value := DM1.ADODataSetReadAccess.FieldByName('Turbidite').AsFloat;
DM1.ADOCommandCopyExcel.Parameters.ParamByName('Temp').Value := DM1.ADODataSetReadAccess.FieldByName('Temp').AsFloat;
DM1.ADOCommandCopyExcel.Parameters.ParamByName('DernierDebit').Value := DernierDebit;
DM1.ADOCommandCopyExcel.Execute;
end;
正如你所看到的,我得到了一个时间差,因为我得到了每分钟的记录。图像中缺少的记录位于数据库的其他位置。
最后,我想知道为什么它不以相同的顺序显示我插入它们。底线是我想使用导出命令将新的访问数据库(.mdb)导出到excel文件,但导出命令似乎采取访问文件并将其复制到excel,因此没有办法订购它,因为出口。我不希望再次选择所有记录并将其插入excel中。
现在,我得到了一个有近180 000条记录的文件,我需要每月拆分它,所以新数据库将有大约44 000条记录。
感谢您的帮助
答案 0 :(得分:3)
大多数数据库中未定义插入位置 - 数据库引擎可以自由地将数据存储在最合适的位置。它可能会选择将记录添加到表的末尾,但它也可能选择重用以前删除的记录腾出的空间。
如果您希望按特定顺序排列结果,请在选择查询中指明,通常包括ORDER BY子句。
答案 1 :(得分:0)
我认为由于.mdb文件的性质,记录应该出现在你插入它们的“顺序”中(在多用户数据库中,这将是混乱的其他任何东西!)。如果您还没有自动编号,请尝试添加自动编号 - 然后您可以在自动编号分配的顺序之后仔细检查。
我将命令放在引号中,因为某些字段(例如autonum)暗示了顺序。如果没有autonum,我们不能以任何特定方式预期结果