Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / C++ Builder + ADO + Access + Excel помогите правильно составить запрос на выборку / 10 сообщений из 10, страница 1 из 1
12.10.2016, 08:41
    #39324994
flanderz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++ Builder + ADO + Access + Excel помогите правильно составить запрос на выборку
Добрый день. Мне нужно выбрать данные из Excel в БД Access. Записей в Excel порядка 60000.
В Access 2007 составляю SQL запрос:
Код: sql
1.
2.
SELECT [Sheet1$].[Артикул], [Sheet1$].[Цена розничная], [Sheet1$].[Цена опт]
FROM [Excel 12.0 XML; HDR=YES; IMEX=1; DATABASE=d:\projects\RAD\ExcellBase\11aa.xlsx] [Sheet1$];


Скорость выполнения этого запроса в Access не более секунды.
Ввожу в ADOQuery запрос вида:
Код: sql
1.
SELECT * FROM запрос1;


Скорость выполнения данного запроса около 15 секунд
пытаюсь выполнить код:
Код: plaintext
1.
2.
3.
4.
5.
	DM->ADOQaccess->Close();
	DM->ADOQaccess->SQL->Clear();
	DM->ADOQaccess->SQL->Add("SELECT [Sheet1$].[Артикул], [Sheet1$].[Цена розничная], [Sheet1$].[Цена опт] FROM [Excel 12.0 XML; HDR=YES; IMEX=1; DATABASE=:r][Sheet1$];");
	DM->ADOQaccess->Parameters->ParamByName("r")->Value = "d:\projects\RAD\ExcellBase\11aa.xlsx";
	DM->ADOQaccess->Open();


Пишет, что не найден параметр "r"
В принципе мне нужно передавать путь к базе через параметр. Может быть у кого-нибудь есть какие-нибудь идеи?
...
Рейтинг: 0 / 0
12.10.2016, 11:53
    #39325176
PPA
PPA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++ Builder + ADO + Access + Excel помогите правильно составить запрос на выборку
flanderz,

В С/C++ слэш нужно экранировать:
"d:\\projects\\RAD\\ExcellBase\\11aa.xlsx"
...
Рейтинг: 0 / 0
12.10.2016, 14:42
    #39325361
flanderz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++ Builder + ADO + Access + Excel помогите правильно составить запрос на выборку
PPAflanderz,

В С/C++ слэш нужно экранировать

Прошу прощения, не заметил, что не указал в коде экранирование.
В программе оно есть. Но почему билдер выдает ошибку "Parametr "r" not found"?
Вроде все правильно указано? Почему параметр не найден?
...
Рейтинг: 0 / 0
12.10.2016, 14:48
    #39325367
PPA
PPA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++ Builder + ADO + Access + Excel помогите правильно составить запрос на выборку
flanderz,

А ты точно создал этот параметр?
в коде видно только обращение.
...
Рейтинг: 0 / 0
12.10.2016, 18:47
    #39325607
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++ Builder + ADO + Access + Excel помогите правильно составить запрос на выборку
flanderz,

Прежде чем обращаться к параметру по имени, надо добавить этот параметр в коллекцию параметров.
Это можно сделать либо вручную: https://msdn.microsoft.com/en-us/library/ms681564(v=vs.85).aspx
Либо автоматически, на основе уже существующего запроса: https://msdn.microsoft.com/en-us/library/ms675046(v=vs.85).aspx
...
Рейтинг: 0 / 0
13.10.2016, 09:11
    #39325883
flanderz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++ Builder + ADO + Access + Excel помогите правильно составить запрос на выборку
PPA,White Owl
Код: sql
1.
DATABASE=:r


Параметр определен в запросе. Разве не так?
...
Рейтинг: 0 / 0
13.10.2016, 10:20
    #39325973
Vladimir Baskakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++ Builder + ADO + Access + Excel помогите правильно составить запрос на выборку
А почему файл базы не вклеивать прямо в строку? я сильно не уверен, что параметры допустимы в клозе FROM. т.е.

select * from :r

- это неправильно, парсер должен разобрать запрос до выделения параметров, а как он будет разбирать, если не знает к чему запрашивать?
...
Рейтинг: 0 / 0
13.10.2016, 10:51
    #39326010
flanderz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++ Builder + ADO + Access + Excel помогите правильно составить запрос на выборку
Vladimir Baskakov,
Если передавать строку

"[Excel 12.0 XML; HDR=YES; IMEX=1; DATABASE=DATABASE='d:\\projects\\RAD\\ExcellBase\\11aa.xlsx][Sheet1$]'"][Sheet1$]"

в параметр, то пишет, что параметр неправильно определен. Представлены неполные или несогласованные сведения. Мне бы в качестве параметра передать путь и имя к Excel файлу.
...
Рейтинг: 0 / 0
13.10.2016, 11:54
    #39326104
Vladimir Baskakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++ Builder + ADO + Access + Excel помогите правильно составить запрос на выборку
flanderz,

я так и говорю - не надо передавать параметры в секцию FROM.
имя базы, таблицы, поля и т.д. - не может быть параметром. не должно. Это нужно вклеивать в тело запроса, а не параметризовать.
...
Рейтинг: 0 / 0
14.10.2016, 12:16
    #39326956
flanderz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++ Builder + ADO + Access + Excel помогите правильно составить запрос на выборку
Спасибо всем, кто участвовал в обсуждении, особенно помог Vladimir Baskakov.
Конечный рабочий результат получился таким:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
	if(OpenDExcell->Execute()){
		filePatch = OpenDExcell->FileName;
	}
	DM->ADOQaccess->Close();
	DM->ADOQaccess->SQL->Clear();
	DM->ADOQaccess->SQL->Add("SELECT [Sheet1$].[Артикул], [Sheet1$].[Цена розничная], [Sheet1$].[Цена опт]"
							" FROM [Sheet1$] IN '"+ filePatch +"' [Excel 12.0;HDR=yes;]");
	DM->ADOQaccess->Open();


Остался один вопрос: почему в access данный запрос выполняется за секунду, а в программе секунд 10-15. Сколько раньше не работал с Аксессом, такого не было, выборка происходила достаточно быстро. Правда тогда мне не нужно было делать выборку из Экселя. Может у кого-нибудь есть мысли по этому поводу?
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / C++ Builder + ADO + Access + Excel помогите правильно составить запрос на выборку / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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