|
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
|
||||
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(); КонецЦикла; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |