2016-05-27 5 views
1

Im чтение одной базы данных Access с ADO и копирования данных в другую с той же структурой. Моя проблема в том, что когда-то, он не вставляет в конец файла.Запись не вставляется в конец файла доступа с delphi

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; 

Итак, я прочитал свою базу данных и закажу ее по дате. Теперь я должен сделать некоторые изменения в данных, когда я скопирую их в новую базу данных.

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 с помощью команды export, но команда экспорта, похоже, берет файл доступа и копирует его, чтобы преуспеть, как есть, поэтому его невозможно заказать, поскольку экспорт. Я не хочу повторять все записи снова с помощью select и вставлять его в excel один за другим.

Прямо сейчас у меня есть файл с почти 180 000 записями, и мне нужно разделить его в месяц, поэтому новая база данных будет содержать около 44 000 записей.

Спасибо за вашу помощь

ответ

3

место вставки не определенно в большинстве баз данных - ядро ​​базы данных имеет свободу для хранения данных, где она считает наиболее целесообразной. Он может захотеть добавить записи в конец таблицы, но может также выбрать повторное использование пространства, освобожденного ранее удаленными записями.

Если вы хотите получить результаты в определенном порядке, укажите, что в вашем запросе на выбор, как правило, включив предложение ORDER BY.

+0

Итак, если я понимаю, у меня не будет выбора вставить строку за строкой мои данные из ms-access в ms-excel, так как я не могу убедиться что база данных доступа не должна правильно начинаться. – Carl

+0

Странная вещь заключается в том, что я не удалял ранее запись в моей базе данных, потому что перед вставкой данных я получил пустую таблицу (которая была уплотнена). – Carl

+0

Я ожидаю, что вы сможете создавать свои таблицы в любом порядке; вы не указали код, который вы используете для этого. Кроме того, Excel также поддерживает сортировку. –

0

Я считаю, что записи должны появляются в "порядке", которые вы вставляли в силу из-за природы файлов .mdb (в многопользовательском db это было бы хаосом, чтобы быть чем-то еще!). Попробуйте добавить номер автонабора, если у вас его еще нет, вы можете дважды проверить, после чего был назначен порядок автонабора.

Я поместил порядок в кавычки, потому что заказ подразумевается некоторым полем (например, autonum). Если нет autonum, мы не можем ожидать результатов каким-либо конкретным образом.

+0

Я бы хотел, чтобы он заказывал так, как я вставляю их, но теперь, как это происходит. – Carl

+0

Я изменяю столбец, который будет autonum и в delphi, я увеличиваю эту строку для каждой вставки, и когда я проверяю файл доступа напрямую с MS Access, столбец autonum находится не в правильном порядке. Я могу только от 85664 до 85718, и я увижу недостающую строку позже в файле. – Carl

+0

Как написать мою команду sql в delphi, чтобы столбец autonum автоматически заполнился числом без необходимости добавления целочисленного значения в этот столбец ? – Carl