Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / ADOCommand загрузка Excel spreadsheet в Access / 8 сообщений из 8, страница 1 из 1
13.07.2008, 00:50
    #35427032
Latent Force
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADOCommand загрузка Excel spreadsheet в Access
Привет!

Задал этот вопрос в форуме по Delphi ( тут ), но не совсем уверен, что там в тему поскольку больно общий вопрос. Модераторы, плиз, удалите лишний, если не прав.

Стоит задача загрузить данные из Excel в Access. Делаю так:
1. Создаю соединение к Access
2. Создаю ADOCommand с CommandText := 'INSERT INTO access_table SELECT * FROM ["Excel 8.0;Database=%s;HDR=Yes"].[excel_range]'
3. Радуюсь.

Но радость моя не полная! Потому что когда вдруг в поле в Excel вместо числового значения оказывается строковое, то всё это дело откатывается и ничего не загружается.
НО! Возьмем к примеру сам Access. И воспользуемся его DoCmd.TransferSpreadsheet. То этот гад загружает всё что есть, с одним только исключением: поля которые не соответствуют типу инициализируются Null-значениями.

Спрашивается вопрос: есть ли возможность в свойствах ADOCommand или ADOConnection указать Accessу поступать так же, т.е не вываливаться с ошибкой и не откатывать все, а вставлять Null?
...
Рейтинг: 0 / 0
13.07.2008, 22:24
    #35427403
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADOCommand загрузка Excel spreadsheet в Access
если нужно именно из делфи (так просто в екселе сделал запрос к листу екселе и занес что нужно), то делай построчно, открывай рекордсет на основе листа екселя и вставляй по одной строчке в акс обрабатывая исключения
...
Рейтинг: 0 / 0
14.07.2008, 10:29
    #35427800
Latent Force
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADOCommand загрузка Excel spreadsheet в Access
barrabasто делай построчно
заметно проигрывает, если очень большой файл. а второе - эксепшн не говорит в каком месте несоответствие типов, в каком столбце, например. т.е. необходим потом еще дополнительный анализ.
...
Рейтинг: 0 / 0
14.07.2008, 11:12
    #35427983
Latent Force
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADOCommand загрузка Excel spreadsheet в Access
Вообще, как вариант решения можно сделать следующее:
Открыть 2 соединения: одно в Excel, другое в Access. Читать построчно из Excel-таблицы и присваивать значение по полям отлавливая exception и в нем присваивая Null. Но это значительно дольше :( Может кто знает как убыстрить алгоритм?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
       while not ExcelTable.Eof do
        begin
          AccessTable.Append;
          for F :=  0  to ExcelTable.FieldCount -  1  do
          begin
            try
              AccessTable.FieldByName(ExcelTable.Fields[F].FieldName).Value :=
                ExcelTable.Fields[F].Value;
            except
              AccessTable.FieldByName(ExcelTable.Fields[F].FieldName).Value := Null;
            end;
          end;
          AccessTable.Post;
          ExcelTable.Next;
        end;
...
Рейтинг: 0 / 0
14.07.2008, 17:30
    #35429311
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADOCommand загрузка Excel spreadsheet в Access
Latent Force barrabasто делай построчно
заметно проигрывает, если очень большой файл. а второе - эксепшн не говорит в каком месте несоответствие типов, в каком столбце, например. т.е. необходим потом еще дополнительный анализ.
а если просто использовать автоматизацию ?
как в делвях не помню но типа этого
object app = createobject("Access.Aplication")
app.currentbd = "...mdb" - или както так
т.е. фактически делать всю работу будет акс (там и используй docmd), и не забудь закрыть app после работы с ним.
...
Рейтинг: 0 / 0
14.07.2008, 17:44
    #35429359
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADOCommand загрузка Excel spreadsheet в Access
а если попробовать использовать Val и IIF в запросе
...
Рейтинг: 0 / 0
15.07.2008, 18:28
    #35432016
Latent Force
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADOCommand загрузка Excel spreadsheet в Access
С автоматизацией не пробовал еще. Что-то у меня какая-то неприязнь к ним с прошлых времен осталась, когда вроде бы и закрываешь и удаляешь, а процесс висеть остается.

barrabasа если попробовать использовать Val и IIF в запросе
поля перечислять нужно в запросе тогда. А там таблица на 25-30 полей. Иду по пути наименьшего сопротивления :) договариваюсь, что либо дольше, либо выбрасывать ошибку и пока не исправят не давать загружать. Теоретически правильнее закачивать валидные данные, конечно...
...
Рейтинг: 0 / 0
16.07.2008, 18:10
    #35434891
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADOCommand загрузка Excel spreadsheet в Access
Latent ForceС автоматизацией не пробовал еще. Что-то у меня какая-то неприязнь к ним с прошлых времен осталась, когда вроде бы и закрываешь и удаляешь, а процесс висеть остается.

значит не все объекты связанные с апликейшин закрыл (ну например книгу екселя забыл закрыть, а сам ексель закрываешь).
Latent Force barrabasа если попробовать использовать Val и IIF в запросе
поля перечислять нужно в запросе тогда. А там таблица на 25-30 полей. Иду по пути наименьшего сопротивления :) договариваюсь, что либо дольше, либо выбрасывать ошибку и пока не исправят не давать загружать. Теоретически правильнее закачивать валидные данные, конечно...
ну да, этож один копипаст в селект
ну вобщем главное чтоб заказчика устроило
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / ADOCommand загрузка Excel spreadsheet в Access / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]