Имя: Пароль:
1C
1С v8
Microsoft ACE OLEDB 12.0. Нужно ДОписывать в *.xlsx. Ошибка 'Только для чтения'
0 aka AMIGO
 
15.07.15
11:12
Дозапись - после конца файла
Код:

        MyCon = Новый COMОбъект ("ADODB.Connection");
        MyCon.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+Путь+";Extended Properties=""Excel 12.0 Xml;HDR=No;IMEX=1""");
        MyRst = Новый COMОбъект ("ADODB.Recordset");
        MyStr = "select * from [MKD$]";
        MyRst.Open (MyStr, MyCon, 2, 3);//adOpenDynamic, adLockOptimistic
        Пока НЕ MyRst.EOF() Цикл
            //Сообщить...
            MyRst.MoveNext();
        КонецЦикла;
        MyRst.AddNew();
        //MyRst.Fields(MyRst.Fields.Item(6).Name).Value = "8ab4e328-a96d-4097-a704-23825a446727";


Ошибка:

{Форма.Форма.Форма(69)}: Ошибка при вызове метода контекста (AddNew)
        MyRst.AddNew();
по причине:
Произошла исключительная ситуация (Microsoft Office Access Database Engine): Cannot update.  Database or object is read-only.

Файл существует, я в него пишу вручную. В свойствах - не RO.

Как открыть этот файл для записи?
1 Casey1984
 
15.07.15
11:23
Глянь MyRst.LockType, если 1 то ReadOnly.
2 Casey1984
 
15.07.15
11:25
Хотя по коду ты 3 ставишь(
3 aka AMIGO
 
15.07.15
11:29
(1) (2) да, значение 3
4 Бубка Гоп
 
15.07.15
11:31
глянь что в MyRst.CursorLocation перед выполнением MyRst.AddNew();
ну и INSERT-ом попробуй запись добавить ради чистоты эксперимента
5 aka AMIGO
 
15.07.15
11:31
вот тут http://www.script-coding.com/ADO.html
есть режим Прова Mode, может его попробовать..
Минуточку..
6 aka AMIGO
 
15.07.15
11:32
(4) возвращает 2
7 Casey1984
 
15.07.15
11:36
(6) в примере от MS CursorType = 1 (adOpenKeyset), ненаю как связано с записью.
8 Бубка Гоп
 
15.07.15
11:36
(6) стало быть курсор движется.
Если INSERT сможет добавить запись - значит надо копать свойства RecordSet, если нет - свойства подключения ADODB/права на файл
9 Бубка Гоп
 
15.07.15
11:38
вот тут говорят таки Mode надо присвоить ReadWrite
http://www.dreamincode.net/forums/topic/116510-ado-read-only-recordset-problem/
10 Бубка Гоп
 
15.07.15
11:44
и еще один момент, емнип, в CursorLocation должно быть "на клиенте" (не помню какое это значение)
11 aka AMIGO
 
15.07.15
11:51
(9) у меня уже стояло
MyCon.Mode ="adModeReadWrite(3)"; //чтение и запись
всё равно бесславный конец..
12 aka AMIGO
 
15.07.15
11:59
(8) INSERT - не знаю как вставлять.. :((

свойства подключения ADODB/права на файл где-ж и как эти права выставляются?
13 aka AMIGO
 
15.07.15
12:01
вычитал еще вот тут: http://www.script-coding.com/ADO.html
>>Свойство ConnectionString доступно для записи только для закрытого соединения. Многочисленные примеры различных строк подключения для различных типов баз данных вы можете найти в Интернете или в документации к соответствующим программным продуктам.<<

первое предложение - радует, а второе убивает всю радость :)
14 Бубка Гоп
 
15.07.15
12:04
CursorLacation присвой 3 до открытия RecordSet
15 Бубка Гоп
 
15.07.15
12:07
(13) имеется ввиду что тот же Mode, как и другие параметры, необходимо указывать до открытия соединения. то же можно отнести и к RecordSet
16 aka AMIGO
 
15.07.15
12:12
(14) прокатило!
теперь новое дело.. Вроде присвоилось значение ячейке, но.. но:
{Форма.Форма.Форма(79)}: Ошибка при вызове метода контекста (Update)
        MyRst.Update();
по причине:
Произошла исключительная ситуация (Microsoft Office Access Database Engine): Operation must use an updateable query.

блин..
17 aka AMIGO
 
15.07.15
12:19
ЗЫ. как-же плохо без Excel"я..

что-ж это за  updateable query ?
Попытаюсь найти в инете..
Пока вот: https://support.microsoft.com/ru-ru/kb/175168
18 aka AMIGO
 
15.07.15
12:26
кстати, не это-ли причина?
http://pics.rsh.ru/img/RO_f2ok87t8.png
19 aka AMIGO
 
15.07.15
12:26
(18) последняя строка - мои права на компе
20 aka AMIGO
 
15.07.15
12:29
(19) + нет.. добавил прав на файл, ошибка осталась..
21 aka AMIGO
 
15.07.15
12:53
вот что в отладчике.. Интересная последняя строка:
http://pics.rsh.ru/img/RO_ugnmlbrd.png
Не это=ли причина, и как её устранить?
22 Casey1984
 
15.07.15
12:58
(21) так все правильно вроде: adEditAdd = 2:
    
Indicates that the AddNew method has been called, and the current record in the copy buffer is a new record that has not been saved in the database.
23 Casey1984
 
15.07.15
13:01
24 aka AMIGO
 
15.07.15
13:02
(22) (23)  понятно :)
25 lEvGl
 
гуру
15.07.15
13:35
запросом обновить, интересно, не получится..
26 Serginio1
 
15.07.15
13:52
Так работает. Правда через запрос

Connection = Новый COMОбъект("ADODB.Connection");
    Connection.Open(ActiveConnection);
    Command = Новый COMОбъект("ADODB.Command");
    Command.ActiveConnection = Connection;
    Command.CommandType = 1;
27 Serginio1
 
15.07.15
13:52
Параметры= Command.Parameters;    
    ТекстВопросов=" VALUES(";
    ТекстКоманды= "INSERT INTO [Лист1](";
    Для каждого парам из Параметры Цикл
        ТекстКоманды=ТекстКоманды+парам.Name+",";
        ТекстВопросов=ТекстВопросов+"?,"
    КонецЦикла;    
    ТекстКоманды=Лев(ТекстКоманды,стрДлина(ТекстКоманды)-1)+") "+Лев(ТекстВопросов,стрДлина(ТекстВопросов)-1)+")";
    Сообщить(ТекстКоманды);
    Command.CommandText=ТекстКоманды;
    
    //     Command.CommandText="INSERT INTO [Лист1$](Марка,Номер,Количество,Цена,Название)  VALUES('Марка','Номер',1,2.2,'Название')";
    //     Command.Execute();
    //возврат;
    
    Command.prepared=истина;
    
    
    //Command.CommandText=ТекстКоманды;
    Для каждого Выборка из Тз Цикл
        Для каждого парам из Параметры Цикл
            Значение=Выборка[Парам.Name];
            Если Парам.Type=203 Тогда
                Парам.Size=СтрДлина(Значение)+1;
            КонецЕсли;    
            Парам.Value=Значение;
            
        КонецЦикла;    
        
        
        Command.Execute();
    КонецЦикла;
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн