Имя: Пароль:
1C
 
Проблема с ADO
,
0 Начинающий Восьмерочн
 
05.07.17
15:13
Есть выгрузка данных из 1с в Postgresql с таким кодом

Состояние("Выгружаются товары");
    
    cmd  = Новый COMОбъект("ADODB.command");
    cmd.ActiveConnection  = ADOConnection;
    cmd.CommandText = "DELETE FROM product";
    cmd.Execute();
    cmd.CommandText = АдоПараметры;    
    cmd.Prepared = true;    
    
    cmd.Parameters.Append(cmd.CreateParameter("@id", 3, 1,,));
    cmd.Parameters.Append(cmd.CreateParameter("@name", 130, 1,128,));
    cmd.Parameters.Append(cmd.CreateParameter("@pid", 3, 1,,));        
    cmd.Parameters.Append(cmd.CreateParameter("@base", 130, 1,3,));
    cmd.Parameters.Append(cmd.CreateParameter("@fk_group", 3, 1,,));
    cmd.Parameters.Append(cmd.CreateParameter("@grp", 11, 1,,));
    cmd.Parameters.Append(cmd.CreateParameter("@barcode", 130, 1,16,));
    cmd.Parameters.Append(cmd.CreateParameter("@popular", 3, 1,,));
    cmd.Parameters.Append(cmd.CreateParameter("@price", 3, 1,,));
                      
    //id,name,pid,base,fk_group,grp,barcode,popular
    //INSERT INTO product (id,name,pid,base,fk_group,grp,barcode,popular) VALUES (?,?,?,?,?,?,?,?);
    Для каждого СтрокаТЗ из АДО_Запрос Цикл
        
        Сп = ИзСтрокиСРазделителями(СтрокаТЗ.Значения);                
        
        cmd.Parameters.item(0).value = Число(Сп.Получить(0).Значение);
        cmd.Parameters.item(1).value = Сп.Получить(1).Значение;
        cmd.Parameters.item(2).value = Число(Сп.Получить(2).Значение);        
        cmd.Parameters.item(3).value = Сп.Получить(3).Значение;
        cmd.Parameters.item(4).value = Число(Сп.Получить(4).Значение);
        cmd.Parameters.item(5).value = ?(Сп.Получить(5).Значение="0","false","true");
        Штрихкод = СокрЛП(СтрЗаменить(Сп.Получить(6).Значение," ",""));
        Если СтрДлина(Штрихкод)>16 Тогда
            Штрихкод = Сред(Штрихкод,0,16);
        КонецЕсли;            
        cmd.Parameters.item(6).value = Штрихкод;//СтрЗаменить(Сп.Получить(6).Значение," ","");
        cmd.Parameters.item(7).value = Число(Сп.Получить(7).Значение);
        cmd.Parameters.item(8).value = Число(Сп.Получить(8).Значение);
        
        попытка        
            cmd.Execute();         
        Исключение
            Сообщить(" " + ОписаниеОшибки()+" "+Число(Сп.Получить(0).Значение));
        КонецПопытки
                
    КонецЦикла;    

Параметр grp имеет тип булево и в 2003 нормально работал этот код, при переходе на 2008 получаю ошибку


{ВнешняяОбработка.такаято.Форма.Форма.Форма(1269)}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): ERROR: column "grp" is of type boolean but expression is of type "char";
Error while preparing parameters

причем ошибка происходит на в драйвере PostgreSQL а в провайдере
Microsoft, как эту ситуацию исправить непонятно, не хочется переписывать этот кусок ведь ошибок в нем нет, может кто то сталкивался с подобным, что посоветуете.
1 Лефмихалыч
 
05.07.17
15:14
"false","true" - это не булево. Это строка с изображением булева

истина, ложь вместо этого используй
2 Лефмихалыч
 
05.07.17
15:15
точнее - наоборот их местами поменяй.
Ну, ты понял
3 Начинающий Восьмерочн
 
05.07.17
15:25
Это уже измененный код в оригинале там false и true конечно, но то что указано строкой это никак не мешает, параметр видится верно http://clip2net.com/s/3LThDyX
4 Ёпрст
 
05.07.17
15:38
та едет ?
cmd.Parameters.item(5).value = ?(Сп.Получить(5).Значение="0",0,-1);
5 Начинающий Восьмерочн
 
05.07.17
15:59
(4) Нет не работает.
6 Ёпрст
 
05.07.17
16:06
(5) ну, тогда забей на передачу параметров, просто в тексте запроса пиши свои false/true
7 Ёпрст
 
05.07.17
16:07
просто составляя динамически текст запроса
8 Начинающий Восьмерочн
 
05.07.17
16:12
(6)(7)  По видимому ничего не остается как отказаться от параметризованного запроса и переделать на динамическую строку, просто подумал, может есть простой выход.
9 Начинающий Восьмерочн
 
06.07.17
13:44
Динамическая строка запроса заработала нормально.
10 Лефмихалыч
 
06.07.17
13:52
(3) Да я прекрасно вижу, что cmd.Parameters.item(5).value - это true/false!
У тебя причина всего этого в что, что ты в параметр, который должен быть true/false, суёшь строку. Причем, в момент, когда ты суёшь, ни чег оне происходит, т.к. проблема возникате тогда, когда ты выполняешь запрос с этим параметром.
11 Начинающий Восьмерочн
 
06.07.17
15:13
(10) Это не так, там нормально видится параметр в отладчике
http://clip2net.com/s/3LThDyX и на скрине только один из вариантов сначала там было просто булево.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс