Имя: Пароль:
1C
1С v8
Для требуемой операции необходим объект OLE DB Session, не поддерживаемый текущи
0 nemoxp
 
22.11.14
23:25
Подключаюсь к базе Акцесс:

Процедура КнопкаВыполнитьНажатие(Кнопка)
    Access = Новый COMОбъект("ADODB.CONNECTION");
    Попытка
        СтрокаПодключения="Driver={Microsoft Access Driver (*.mdb)};D:\tiralana_data.mdb";
        Access.Open(СтрокаПодключения);
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;

    Команда = Новый COMОбъект("ADODB.Command");     //Создаем команду
    Команда.ActiveConnection = Access;                 //Указываем подключение
    ТекстЗапроса = "SELECT * FROM invoices";
    НаборЗаписей = Новый COMОбъект("ADODB.RecordSet");
    Команда.CommandText = ТекстЗапроса;
    Попытка
        НаборЗаписей = Команда.Execute();         // выполняем запрос
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;

КонецПроцедуры


Выдает ошибку: "Для требуемой операции необходим объект OLE DB Session, не поддерживаемый текущим поставщиком."

Как побороть?
1 nemoxp
 
22.11.14
23:26
Ругается на строку:

Команда.ActiveConnection = Access;
2 Deon
 
22.11.14
23:53
Попробуй строку подключения заменить на:
СтрокаПодключения = "PROVIDER=MICROSOFT.JET.OLEDB.4.0;Data Source=D:\tiralana_data.mdb";
3 nemoxp
 
22.11.14
23:58
{Форма.Форма.Форма(6)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft JET Database Engine): Нераспознаваемый формат базы данных: 'D:\tiralana_data.mdb'.
4 nemoxp
 
23.11.14
00:00
он и с предыдущим драйвером не подключается. недавно вроде подключался. сейчас пишет: {Форма.Форма.Форма(6)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): Операция была отменена.
5 nemoxp
 
23.11.14
00:01
Access установлен, база акцессом открывается...
6 Deon
 
23.11.14
00:01
какой версии access?
7 nemoxp
 
23.11.14
00:02
2007
8 Deon
 
23.11.14
00:08
может так?
СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\tiralana_data.mdb;Persist Security Info=False;";
9 nemoxp
 
23.11.14
00:15
Спасибо получилось!
Microsoft.ACE.OLEDB.12.0 - это только для 2007?

Как узнать тогда для других версий Акцесса?
10 Deon
 
23.11.14
00:20
да я думаю для любых подойдет
11 nemoxp
 
23.11.14
00:25
Вопрос. В коде есть запрос к таблице. Как получить все записи? НаборЗаписей - com объект. Нашел только поля, а самих строк нет...
12 Deon
 
23.11.14
00:27
покажи код
13 nemoxp
 
23.11.14
00:29
Т = Новый ТаблицаЗначений;
    Т.Очистить();
    
    Access = Новый COMОбъект("ADODB.CONNECTION");
    Попытка
        СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\tiralana_data.mdb;Persist Security Info=False;";//"Driver={Microsoft Access Driver (*.mdb)};D:\tiralana_data.mdb";
        Access.Open(СтрокаПодключения);
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;

    Команда = Новый COMОбъект("ADODB.Command");     //Создаем команду
    Команда.ActiveConnection = Access;                 //Указываем подключение
    ТекстЗапроса = "SELECT * FROM invoices";
    НаборЗаписей = Новый COMОбъект("ADODB.RecordSet");
    Команда.CommandText = ТекстЗапроса;
    Попытка
        НаборЗаписей = Команда.Execute();         // выполняем запрос
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
    
    Для е = 0 по (НаборЗаписей.Fields.Count - 1) Цикл  //Определяем имена полей таблицы
        Т.Колонки.Добавить(СокрЛП(НаборЗаписей.Fields(е).Name));
    КонецЦикла;
    //НаборЗаписей.MoveFirst();
    //Пока НаборЗаписей.EOF() = 0 Цикл //Перебираем поля и записи
    //    Стр = Т.Добавить();
    //    Для е = 0 по (НаборЗаписей.Fields.Count - 1) Цикл
    //        Т.УстановитьЗначение(Т.Количество(), СокрЛП(НаборЗаписей.Fields(е).Name), НаборЗаписей.Fields(е).Value); // записываем значения в таблицу
    //    КонецЦикла;
    //    НаборЗаписей.MoveNext();
    //КонецЦикла;
14 Deon
 
23.11.14
00:42
а что с закомментированным кодом? не работает?
15 nemoxp
 
23.11.14
00:52
Т.УстановитьЗначение не работает, взял из инета. пока не разобрался с этим оператором. нужно переписать...
16 nemoxp
 
23.11.14
00:55
Вроде бы получилось... Написал так:

НаборЗаписей.MoveFirst();
    Пока НаборЗаписей.EOF() = 0 Цикл //Перебираем поля и записи
        Стр = Т.Добавить();
        Для е = 0 по (НаборЗаписей.Fields.Count - 1) Цикл
            Т[Т.Количество()-1][СокрЛП(НаборЗаписей.Fields(е).Name)] = НаборЗаписей.Fields(е).Value; // записываем значения в таблицу
        КонецЦикла;
        НаборЗаписей.MoveNext();
    КонецЦикла;
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой