|
Запись в 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
|
+(31)
Мускул зло, а скуль рулит :) http://blog.nagaychenko.com/2011/03/11/особенности-работы-last_insert_id-и-auto_increment-в-mysql/ |
|||
38
sapphire
20.05.15
✎
17:55
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |