使用delphi

时间:2016-05-27 14:34:20

标签: sql delphi ms-access ado

我正在使用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;

当我检查新数据库时,我在图像中得到以下结果: Part of access database

正如你所看到的,我得到了一个时间差,因为我得到了每分钟的记录。图像中缺少的记录位于数据库的其他位置。

最后,我想知道为什么它不以相同的顺序显示我插入它们。底线是我想使用导出命令将新的访问数据库(.mdb)导出到excel文件,但导出命令似乎采取访问文件并将其复制到excel,因此没有办法订购它,因为出口。我不希望再次选择所有记录并将其插入excel中。

现在,我得到了一个有近180 000条记录的文件,我需要每月拆分它,所以新数据库将有大约44 000条记录。

感谢您的帮助

2 个答案:

答案 0 :(得分:3)

大多数数据库中未定义插入位置 - 数据库引擎可以自由地将数据存储在最合适的位置。它可能会选择将记录添加到表的末尾,但它也可能选择重用以前删除的记录腾出的空间。

如果您希望按特定顺序排列结果,请在选择查询中指明,通常包括ORDER BY子句。

答案 1 :(得分:0)

我认为由于.mdb文件的性质,记录应该出现在你插入它们的“顺序”中(在多用户数据库中,这将是混乱的其他任何东西!)。如果您还没有自动编号,请尝试添加自动编号 - 然后您可以在自动编号分配的顺序之后仔细检查。

我将命令放在引号中,因为某些字段(例如autonum)暗示了顺序。如果没有autonum,我们不能以任何特定方式预期结果