Имя: Пароль:
1C
 
V8: Работа с ADO
Ø
0 DiUs
 
19.04.05
20:22
Вылетает странная ошибка при синтаксическом контроле (!) на строке НаборЗаписей.Fields("n_booklet") = инд;
ВнешняяОбработка.ВыгрузкаWC(19,37)}: Неопознанный оператор
      НаборЗаписей.Fields("n_booklet") <<?>>= инд;
Вот текст:
...
    Соединение = Новый COMОбъект("ADODB.Connection");
    СтрокаСоединения = ...
    Соединение.Open(СтрокаСоединения);
    НаборЗаписей = Новый COMОбъект("ADODB.RecordSet");
    Соединение.Execute("delete from orders");
    Если НаборЗаписей.State = 1 ТОгда
      НаборЗаписей.Close();
    КонецЕсли;
    НаборЗаписей.Open("orders",Соединение, 1, 3);
    Для инд = 0 По 9 Цикл
      НаборЗаписей.Fields("n_booklet") = инд;
    КонецЦикла;
    Соединение.Close();
По идее при синтакс-контроле 1С не знает какие методы есть у COMОбъектов. В чем может быть дело?
1 НВ
 
19.04.05
20:58
Она считает Fields() за функцию и справедливо не дает присвоить
2 черная лошадка
 
20.04.05
09:09
нужно писать вот так:
НаборЗаписей.Fields("название_колонки").Value = НашаПеременная;
3 Gloom
 
20.04.05
09:11
Вообще довольно замысловатый код...
4 DiUs
 
20.04.05
09:17
Спасибо. Помогло так:
ТекПоле1 = НаборЗаписей.Fields("n_booklet");
      ТекПоле1 = инд;
Но теперь проблема с MySQL (я к нему соединяюсь по ADO):
Для инд = 0 По 9 Цикл
  НаборЗаписей.AddNew();
  ТекПоле1 = НаборЗаписей.Fields("n_booklet");
  ТекПоле1 = инд;
  НаборЗаписей.Update();
КонецЦикла;
Ошибка при вызове метода контекста (Update): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DEFAULT VALUES' at line 1
С MySQL никто не дружит?
5 Денис2
 
20.04.05
09:20
(4) может, не выделываться и сотварить непосредственно ыражение Update?
6 черная лошадка
 
20.04.05
09:21
у меня есть смутное подозрение, что мускул ругается на то, что вы пытаетесь добавить в него запись, не установив какое-то обязательное для заполнение поле. то есть в каком-то поле таблицы не стоит значение по умолчанию и вы его тоже не заполняете. отсюда и ошибка.
7 Gloom
 
20.04.05
09:21
(4)Смотри, чего у тебя получается:
ТекПоле1 = НаборЗаписей.Fields("n_booklet");
//Сейчас в переменной ТекПоле1 находится ссылка на объект adodb.field
ТекПоле1 = инд;
//ссылка на adodb.field уничтожена, переменной ТекПоле1 присвоено значение переменной инд
***
Не знает 1цэ ничего про члены классов по-умолчанию, ей надо всё явно указывать - см. (2)
8 черная лошадка
 
20.04.05
09:23
ребят, код в (2) работал у меня из 7.7 и с мусколом, и с акцессом. не думаю, что из-под 8.0 работа с АДО отличается принципиально
9 DiUs
 
20.04.05
09:30
Понял. Спасибо.
НаборЗаписей.Fields("n_booklet").Value = инд; прохавало.
Но теперь проблема со строковым значением (с числом и датой все ок)
НаборЗаписей.Fields("name").Value = "тест";
 Ошибка при установке значения атрибута контекста (Value): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): Произошли ошибки во время выполнения многошаговой операции OLE DB. По возможности, проверьте значения всех состояний OLE DB. Работа не выполнена.
Очень информативно.
10 черная лошадка
 
20.04.05
09:58
может там длина строки 1 символ всего? проверь тип с пристрастием
11 DiUs
 
20.04.05
10:03
Исключено: varchar(128).
Вручную вставляется аж бегом.Тут похоже проблема на уровне ADO... До MySQL еще не добирается, иначе от него бы ошибка выскакивала
12 черная лошадка
 
20.04.05
10:48
может попробовать еще одинарные кавычки добавить? не помню, как в мускуле задаются строки, но не в одинарных ли кавычках? может в этом дело все?
а у меня при работе с акцессом строки проходили на ура. так что имхо это связано с мускулом именно.
13 DiUs
 
20.04.05
10:56
Да, в одинарных, но ADO ведь должно преобразовывать
Попробовал НаборЗаписей.Fields("name").Value = "'тест'"; - та же ошибка.
Наверное, в 1С 8.0 и Аксессе немного разные форматы строк, что 1С-ский АДО не хавает....
14 Gloom
 
20.04.05
11:02
А в таблице первичный ключ имеется?
15 SlavaZ
 
20.04.05
11:06
Так ты ставишь значение НаборЗаписей.Fields("name").Value = "'тест'"; ?
Ведь результат НаборЗаписей - это результат селекта (таблица). Куда же ты 'тест' присваиваешь?
16 DiUs
 
20.04.05
11:16
2 (14) Да, конечно:
  create table orders(
    id int unsigned not null auto_increment,
    n_booklet int,
    name varchar(128),
    date_addr timestamp,
    cost int,
    PRIMARY KEY(id)
  );
2 (15). Нет, это не тупо выборка, это RecordSet в терминах ADO. И код
    НаборЗаписей.AddNew();
    НаборЗаписей.Fields("n_booklet").Value = инд;
    НаборЗаписей.Fields("date_addr").Value = ТекущаяДата();
    НаборЗаписей.Fields("cost").Value = инд*10;
    НаборЗаписей.Update();
Работает отлично. Но если пытаюсь строку вставить (см. выше), то выскакивает ошибка.
17 SlavaZ
 
20.04.05
11:20
Извени, не знал...
Тогда проблема с типами. Попробуй колонке name дать другой тип (ntext, nchar, char и т.п.)
18 Gloom
 
20.04.05
11:22
Версия одбц-драйвера?
19 DiUs
 
20.04.05
11:27
При смене типа на char ничего не изменилось, а вот на text вылезла другая ошибка чуть ниже:
Ошибка при вызове метода контекста (Update): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][Диспетчер драйверов ODBC] Недопустимая длина строки или буфера
      НаборЗаписей.Update();
Интересно, в 1С-как-то можно явно указать, что строка -неограниченной длины: может в этом причина?
20 SlavaZ
 
20.04.05
11:28
Можно попробывать на форме создать реквизит, записывать в него строку и подставлять в Update...
21 DiUs
 
20.04.05
11:29
MySQL ODBC 3.51 Driver
WinXP SP2
Itel Pentium (R) 4 CPU 3.00GHZ
22 Gloom
 
20.04.05
11:40
Попробуй добавить в строку подключения опцию "Option=3" ...
23 DiUs
 
20.04.05
11:50
ПОЛУЧИЛОСЬ!!!
Спасибо всем.
2(22) А что это было? Потому что у меня в док-ции только
ConnectOptionEnum
Constant Value Description
adConnectUnspecified -1 Default. Opens the connection synchronously (after).
adAsyncConnect 16 Opens the connection asynchronously (before).
24 Gloom
 
20.04.05
11:56
(23)Это не адошная опция, а MyODBC. Соотвествует флагам "Don't Optimize Column Widths"(1) и "Return Matching Rows"(2) в настройках DSN.