Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Данные не сохраняются в файле


Автор: Алина 17.12.2005, 15:05
Есть необходимость импортировать данные из Экселевской таблицы в Access'овскую. На форме есть DataSource, привязанный к ADOTable1, BDGrid, который отображает данные из DataSource.

При запуске приложения данные из Экселя достаются, передаются в ADOTable, но после закрытия приложения изменений в аксесовском файле нет.

Код

ADODataSet1.ConnectionString:=
                                'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\WorkA\himija\inp' +
                                '_exp\list1.xls;Extended Properties="Excel 8.0";'; // это экселевский файл с 
                                                                                                              // данными на импорт
with ADODataSet1 do begin
  CommandType := cmdText;
  CommandText := 'SELECT * FROM list1'; //это таблица с данными
  Open;
end;

if form1.ADOTable1.Active then {закрываем таблицу, если она открыта}
  form1.ADOTable1.Close;
tempstring := ExtractFilePath(Application.ExeName);  //выковыриваем путь к базе данных
tempstring:= Copy(tempstring,0, length(tempstring)-1);// удаляем из него последний слэш
MainPath:= Copy(tempstring,0,LastDelimiter('\',tempstring));//выковыриваем подстроку - кусок пути,
                                                                                                //на один уровень выше
form1.ADOTable1.ConnectionString :=
                               'Provider=Microsoft.Jet.OLEDB.4.0;' + // цепляем таблицу к базе
                               'Data Source=' + MainPath + 'db1.mdb;' +
                               'Mode=Share Deny Read|Share Deny Write;' +
                               'Persist Security Info=False';
ADOTable1.open;
form1.ADOTable1.Recordset:=ADODataSet1.Recordset; //перекидываем наборы строк

Что я делаю не так?

Автор: YurikGL 17.12.2005, 16:25
Цитата
form1.ADOTable1.Recordset:=ADODataSet1.Recordset;


меняем на что-то типа
ADODataSet1.open //а то так и не открыли датасет то?

ADODataSet1.first;
repeat
for i:=1 to adoTable.recordcount do
adoTable1.fields[i].value:=adoDataset1.fields[i].value;
adodataset1.next
until adodataset1.eof


Автор: Алина 17.12.2005, 17:57
Код

with ADODataSet1 do begin
CommandType := cmdText;
CommandText := 'SELECT * FROM list1'; //это таблица с данными
Open; // [b]тут мы открываем датасет[/b]
end;


А почему цикл до adoTable.recordcount? оно вообще до вставки данных равно нулю, и как мы можем заряжать цикл до recordcount?
можно так:
ADODataSet1.first;
repeat
for i:=1 to adoTable.flields.count do
adoTable1.fields[i].value:=adoDataset1.fields[i].value;
adodataset1.next
until adodataset1.eof

Но как в таком случае сказать таблице, что мы каждый раз добавляем в нее новую запись?
Может есть способ проще, чем перебирать датасет по кортежам-полям (там ведь может быть несколько миллионов кортежей)?

Автор: YurikGL 17.12.2005, 18:32
Цитата
А почему цикл до adoTable.recordcount?

Сглупил... да fields.count конечно...

к
Цитата
adoTable1.fields[i].value:=adoDataset1.fields[i].value;

добавь
adoTable1.insert
for i:=..... do adoTable1.fields[i].value:=adoDataset1.fields[i].value;
adoTable1.post

з.ы. в конце дня туплю сильно... извиняйте....
з.ы.ы. вроде были стандартные средства экспорта из access в excel и наоборот
з.ы.ы.ы вроде где-то видел кусок запроса, который в одном запросе обращался к разным базам средствами ADO и втыкал через insert into записи из одной базы в другую.... но это - частное решение и повторить то, что там было написано, я не готов.... В общем случае - перебираем поля и записи.
з.ы.ы.ы.ы можно еще взять в буфер и вставить из буфера... работает достаточно быстро smile

Автор: Алина 17.12.2005, 19:27
стандартные средства - это на один раз, имхо... иначе замаешься с ними...

из буфера стало реально работать быстрее в четыре раза примерно!

Автор: YurikGL 17.12.2005, 19:30
Цитата
из буфера стало реально работать быстрее в четыре раза примерно!

Только по превышению определенного объема память кончается и буфер начинает глючить.
Поэтому в свое время я переносил именно по записи...
Кстати, можно еще через OLE работать...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)