Имя: Пароль:
1C
 
Запись в SQL, ошибка - выход за границы массива
0 palladyi
 
20.05.15
16:37
Помогите разобраться: пытаюсь исполнить такой код:

Соединение = Новый COMОбъект("ADODB.Connection");
    Соединение_param = СтрокаПодключения;
    Соединение.CommandTimeOut= 30;
    Попытка
        Соединение.open(СтрокаПодключения);        
    Исключение
        Сообщить("Отсутствует связь с базой Mysql" +    ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    Команда=Новый COMОбъект("ADODB.Command");;
    Команда.ActiveConnection=Соединение;
    Команда.CommandType=1;
    RecordSet=Новый COMОбъект("ADODB.Recordset");
    RecordSet.CursorType=3;
    
    СтрокаИмя         = Строка(ПривязкаКарты.Контрагент.Наименование);
    СтрокаТелефон     = Строка(СтрЗаменить(УправлениеКонтактнойИнформацией.ПолучитьТелефонИзКонтактнойИнформации(ПривязкаКарты.Контрагент),"-",""));
    СтрокаЭлАд         = Строка(ПривязкаКарты.Контрагент.мфоЭлПочта);
    СтрокаИмяПолное = Строка(ПривязкаКарты.Контрагент.НаименованиеПолное);
    СтрокаДР         = Строка(ПривязкаКарты.Контрагент.мфоДатаРождения);
    
    СтрокаПользователь = "INSERT INTO users (username,userphone,email)  VALUES ('%s','%s','%s');";
    
    Команда.Execute(СтрокаПользователь,
    СтрокаИмя,
    СтрокаТелефон,
    СтрокаЭлАд);

при выполнении ругается:
Ошибка при вызове метода контекста (Execute)
    Команда.Execute(СтрокаПользователь,
по причине:
Выход за границы массива

ЧЯДНТ???
Не могу понять, что с ним, это мой первый опыт записи напрямую в sql, так что не бейте сильно ногами, желательно говорить медленно и по два раза...
1 Ёпрст
 
20.05.15
16:37
в инсерте 3 параметра - передаешь 4
2 palladyi
 
20.05.15
16:39
(1) А строка пользователь - это параметр? Это же сам инсерт и есть вроде...
3 Fragster
 
гуру
20.05.15
16:39
(0) вторым параметром должет быть ComSafeArray с параметрами для запроса, ЕМНИП
4 Ёпрст
 
20.05.15
16:40
+1 тьфу млин, не в инсерте , а в Execute, естесственно
5 palladyi
 
20.05.15
16:41
(3) эмм... а можно пример? А то не понял что-то...
6 palladyi
 
20.05.15
16:42
(4) попробовал так:
Команда.CommandText = СтрокаПользователь;
    Команда.Execute(СтрокаИмя,
    СтрокаТелефон,
    СтрокаЭлАд);
теперь Типы не совпадают
7 Ёпрст
 
20.05.15
16:43
тебе, чтоб не забивать голову параметром, достаточно писать так:

ТекстЗапроса = "INSERT INTO users (username,userphone,email)  VALUES ('"+СтрокаИмя   +"','"+СтрокаТелефон+"','"+СтрокаВася+"');";
и вызов
Команда.Execute(ТекстЗапроса);
8 Господин ПЖ
 
20.05.15
16:44
(6) буквари читать не пробовал?

в msdn все ясно написано
9 palladyi
 
20.05.15
16:45
(8) читаю в данный момент, благодаря этому родил то, что есть...
10 Господин ПЖ
 
20.05.15
16:45
и эта хрень:

Команда.Execute(СтрокаПользователь,
    СтрокаИмя,
    СтрокаТелефон,
    СтрокаЭлАд);

к реальной жизни отношения не имеет

Команда.Execute принимает в сигнатуре 3 переменных, вторая их них - массив с параметрами
11 Господин ПЖ
 
20.05.15
16:47
(7) +1
12 palladyi
 
20.05.15
16:47
(10) О, спасибо!
13 palladyi
 
20.05.15
16:48
(7) Вылетает ошибка: Не был задан текст команды для объекта команды.
14 Ёпрст
 
20.05.15
16:49
Тьфу мл..копипасте погубит :)
15 Fragster
 
гуру
20.05.15
16:49
16 palladyi
 
20.05.15
16:50
(14) =)
17 Ёпрст
 
20.05.15
16:51
Команда.CommandText = ТекстЗапроса;
Команда.Execute();
18 Fragster
 
гуру
20.05.15
16:52
Массив = Новый COMSafeArray(VT_VARIANT, 3);
Массив[0] = СтрокаИмя;
Массив[1] = СтрокаТелефон;
Массив[2] = СтрокаЭлАд;

Команда.Execute(ТекстЗапроса, Массив);
19 palladyi
 
20.05.15
16:56
(18) Массив = Новый COMSafeArray(<<?>>VT_VARIANT, 3); переменная не определена.
В кавычках нужно?
20 Fragster
 
гуру
20.05.15
16:57
(19) ну посмотри в СП, а?
21 palladyi
 
20.05.15
16:59
(20) Посмотрел, спс.
Но все равно вылетает ошибка "Не был задан текст команды для объекта команды."
22 palladyi
 
20.05.15
17:18
Всем спасибо!
В итоге получилось вот так:
СтрокаИмя         = "'"+Строка(ПривязкаКарты.Контрагент.Наименование)+"'";
    СтрокаТелефон     = "'"+Строка(СтрЗаменить(УправлениеКонтактнойИнформацией.ПолучитьТелефонИзКонтактнойИнформации(ПривязкаКарты.Контрагент),"-",""))+"'";
    СтрокаЭлАд         = "'"+Строка(ПривязкаКарты.Контрагент.мфоЭлПочта)+"'";
    СтрокаИмяПолное = "'"+Строка(ПривязкаКарты.Контрагент.НаименованиеПолное)+"'";
    СтрокаДР         = "'"+Строка(ПривязкаКарты.Контрагент.мфоДатаРождения)+"'";
    СтрокаПользователь = "INSERT INTO users (username,userphone,email)  VALUES (" + СтрокаИмя + "," + СтрокаТелефон + "," + СтрокаЭлАд +");";
    Команда.CommandText = СтрокаПользователь;
    Команда.Execute();
23 Ёпрст
 
20.05.15
17:23
(22) вот только Строка( выкини везде из кода, аж в глазах рябит от лишнего кода
24 Fragster
 
гуру
20.05.15
17:25
я делал так:

Функция СоздатьКомандуАДО(Соединение, Текст)
    Команда = Новый ComОбъект("ADODB.Command");
    Команда.ActiveConnection = Соединение;
    
    Команда.CommandType = мМагияСКЛ.adCmdText;
    Команда.Prepared = Истина;
    
    Команда.CommandText = Текст;
    Возврат Команда;
КонецФункции

Функция ВыполнитьКомандуАДО(Команда)
    
    Попытка
        Результат = Команда.Execute();
    Исключение
        Инфо = ИнформацияОбОшибке();
        ВызватьИсключение "Ошибка выполнения команды!" + Символы.ПС + Команда.CommandText + Символы.Пс + ПредставлениеОшибки(Инфо);
    КонецПопытки;
    
    Возврат Результат;
КонецФункции

....
    Команда = СоздатьКомандуАДО(Соединение,
        "INSERT INTO FSInventBarcode1C
        |    (DocumentType, RecordId, Status, ItemId, ItemBarCode)
        |VALUES
        |    (1, ?, 2, ?, ?)");
    
    Выборка = Результат.Выбрать();
    ТекНомер = ПолучитьОбновитьПоследнийНомерDAX(Выборка.Количество(), мСоответствиеОбъектовДляОбмена.ИмяТипаПриемника_Штрихкоды1с);
    
    Счетчик = ПолучитьСтруктуруСчетчика(Выборка.Количество(), "Выгрузка штрихкодов");
    Пока Выборка.Следующий() Цикл
        
        ОбновитьСостояниеСчетчика(Счетчик);
        Команда.Parameters.Item(0).Value = ОтформатироватьИОбновитьСчетчикDAX(ТекНомер);
        Команда.Parameters.Item(1).Value = Выборка.СсылкаВДругойИБ;
        Команда.Parameters.Item(2).Value = Выборка.Штрихкод;
        
        ВыполнитьКомандуАДО(Команда);

        Набор = РегистрыСведений.Штрихкоды.СоздатьНаборЗаписей();
        Набор.Отбор.Код.Установить(Выборка.Код);
        ПланыОбмена.УдалитьРегистрациюИзменений(мСоответствиеОбъектовДляОбмена.УзелОбмена, Набор);
    КонецЦикла;
25 Fragster
 
гуру
20.05.15
17:31
или так:

    Параметры = Новый COMSafeArray("VT_VARIANT", 1);
    Параметры.SetValue(0, мСтатусыСтрок.Выгружено);
    
    Recordset = Команда.Execute(,Параметры);
26 palladyi
 
20.05.15
17:34
(23) ОК)
27 sapphire
 
20.05.15
17:35
(7) а засiрать процедурный кеш кошерно, да?
28 palladyi
 
20.05.15
17:35
(25) хм... буду курить, спасибо)
29 palladyi
 
20.05.15
17:35
(27) в смысле?
30 sapphire
 
20.05.15
17:37
(29) когда-нибудь вкурите :)
31 palladyi
 
20.05.15
17:49
Еще вопрос:
как получить ID только что внесенной записи? SELECT LAST_INSERT_ID() возвращает COMОбъект, а нужны цифры..
32 Fragster
 
гуру
20.05.15
17:50
там, где-то внутри твоего ком объекта есть искомое значение
33 sapphire
 
20.05.15
17:51
(32) +1
34 palladyi
 
20.05.15
17:51
(32) а как оно звучит неизвестно? там просто очень много всего...
35 Fragster
 
гуру
20.05.15
17:52
предлагаю тебе уйти на MSDN, где почитать про ADODB.Command, метод Execute, какой объект он возвращает и какие у него есть методы и свойства. потом покурить примеры, хотть они и на c#, но всё равно всё понятно должно быть...
36 palladyi
 
20.05.15
17:52
(35) Ок, попробую, спасибо)
37 sapphire
 
20.05.15
17:52
38 sapphire
 
20.05.15
17:55
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший