Имя: Пароль:
1C
1С v8
Как передать значение параметра decimal из 1с в mysql через ADO?
0 al_zzz
 
24.08.13
13:20
Подскажите, по вопросу в сабже. Если передаю значение типа "Число", то получаю такую ошибку:http://vfl.ru/fotos/140c81932956011.html
А если пытаюсь использовать функцию "Формат", то ругается на неверный тип.
1 shuhard
 
24.08.13
13:21
(0) а если число меньше 1000, конечно работает ?
2 al_zzz
 
24.08.13
13:26
(0)Нет, только ноль без проблем передается
3 Rie
 
24.08.13
13:26
(0) Что значит "передать"? Как параметр?
4 al_zzz
 
24.08.13
13:29
(3)Пар = Команда.CreateParameter(,НаборЗаписей.Fields.item(к).Type,1,НаборЗаписей.Fields.item(к).DefinedSize,тз[0][к]);
        Команда.Parameters.Append(Пар);
5 al_zzz
 
24.08.13
13:30
В тз[0][к] и лежит число, либо отформатированное число.
6 shuhard
 
24.08.13
13:32
(1) обойдись без параметрf, склеивай строку запроса и Where
7 Rie
 
24.08.13
13:36
(4) А тип параметра - точно 14?
8 al_zzz
 
24.08.13
13:42
(1) Такой вариант не подойдет в силу того, что в названии некоторых колонок мускула есть символ "-" и поэтому единственный допустимый синтаксис запроса "Insert into <Table_name> values(?,?,...?)"
(7) Тип читается из набора записей этой же таблицы - должен соответствовать.
9 al_zzz
 
24.08.13
13:44
(7) В отладчике глянул - тип = 131.
10 Rie
 
24.08.13
13:49
(9) Это несущественно. В 5-й версии MySQL разницы нет (по крайней мере, быть не должно).
11 Rie
 
24.08.13
13:49
(4) А на каком из этих операторов валится?
12 al_zzz
 
24.08.13
13:50
Получается, ADODB.Recordset возвращает неправильный тип для decimal?
13 al_zzz
 
24.08.13
13:50
(11) На Execute()
14 Rie
 
24.08.13
13:51
(13) А точно ли в decimal дело? Как выглядит Execute?
15 Rie
 
24.08.13
13:53
+(14) Даже так - если он 0 безболезненно кушает, то тип у 0 - точно такой же, как и у, скажем, 10.2. Значит, тип его устраивает. А не устраивает что-то другое.
16 al_zzz
 
24.08.13
13:59
(15)Я пытался локализовать проблему, когда execute() отказалось выполняться. Получилось выполнить команду только когда закомментировал установку параметра.
В таблице три поля decimal, но в остальные два поля передавались нули и всё по ним нормально отрабатывалось. Тогда я поменял значения для этих полей в 1с на числа и ошибка снова появилась уже для них.
17 Rie
 
24.08.13
14:20
(16) А если сменить тип, к примеру, на 5? И передать число. А MySQL - пусть уж сам преобразует?
18 al_zzz
 
24.08.13
14:37
Попробовал передавать 14(decimal) вместо типа из НаборЗаписей - та же ошибка.
Вот с таким синтаксисом отработало:
  
            Команда.Parameters.Item(к).Value = тз[0][к];
но все русские символы превратились в кракозябры и даты не встали.
Попробовал тогда так:
Если Массив.Найти(тз.Колонки[к].Имя)=Неопределено Тогда  
            Команда.Parameters.Item(к).Value = тз[0][к];
        Иначе    
            Тип    = НаборЗаписей.Fields.item(к).Type;
            Размер = НаборЗаписей.Fields.item(к).DefinedSize;
            Пар = Команда.CreateParameter(,Тип,1,Размер,тз[0][к]);
            Команда.Parameters.Append(Пар);
        КонецЕсли;
в массиве названия полей с датами и русскими символами - та же ошибка. Пробовал наоборот - передавать в массиве только decimal и использовать для них Команда.Parameters.Item(к).Value = тз[0][к];  - та же ошибка.
Что ещё можно попробовать?
19 Rie
 
24.08.13
14:40
(18) Попробуйте тип 5 - это double. А MySql пусть его сам преобразует.
Русские символы? Попробуйте в начале запроса явно указать кодировку (set names).
20 al_zzz
 
24.08.13
14:56
(19) На указание кодировки ругается: "Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [MySQL][ODBC 5.1 Driver][mysqld-5.1.67-log]SET NAMES not allowed by driver"
21 al_zzz
 
24.08.13
15:00
С 5 та же ошибка
22 Rie
 
24.08.13
15:08
(21) А если (в качестве теста) указать тип 3 и присвоить целое значение?
23 Jaap Vduul
 
24.08.13
15:41
(20) В 5.1 убрали поддержку SET NAMES
Попробуй явно указать charset в строке подключения.
http://dev.mysql.com/doc/refman/5.1/en/charset.html
24 al_zzz
 
24.08.13
16:23
(23) Указал и явно в строке подключения - кракозябры вместо русских символов.
25 Torquader
 
24.08.13
22:14
(24) 1С при работе с ADO переводит русские символы в Unicode, так как по OLE передаются только строки Unicode - попробуйте поработать в Unicode.

P.S. можно создать объект MSScriptControl и в нём через VbScript код лазить в ADO, не уверен, что VbScript переварит CDec (в VbScript такого типа тоже нет), но в остальных случаях осечки быть не должно.