|
v7: MySQL / 1c++ / ВыполнитьSQL_ИзТЗ - Передача числового параметра в запрос | ☑ | ||
---|---|---|---|---|
0
Maximich
16.11.16
✎
19:15
|
Добрый день.
Помогите разобраться с проблемой. ODBC драйвер 5.3. Устанавливаю соединение с сервером MySQL. Подключаюсь к базе. Создаю временную таблицу. И пытаюсь туда из ТЗ залить данные. Ошибок нет. Все отлично. Но когда пытаюсь сделать запрос к этой таблице. Вместо чисел возвращаются нули. При этом текст выгружается нормально. Перепробовал уже все подходящие типы из http://www.1cpp.ru/docum/icpp/html/ODBC.html#addparam Результата также ноль. Пример кода: ТЗ=СоздатьОбъект("ТаблицаЗначений"); ТЗ.НоваяКолонка("id","Число",8); ТЗ.НоваяСтрока(); ТЗ.id = 1; ТЗ.НоваяСтрока(); ТЗ.id = 2; RS.Выполнить("DROP TEMPORARY TABLE IF EXISTS tmp_table;"); RS.Выполнить("CREATE TEMPORARY TABLE tmp_table(id INT(8));"); RS.ДобПараметр(1,4,8,0); RS.Подготовить("INSERT INTO tmp_table (id) VALUES(?);") RS.ВыполнитьSQL_ИзТЗ(ТЗ); ИТ_Проверка=СоздатьОбъект("ИндексированнаяТаблица"); RS.ВыполнитьИнструкцию("SELECT * FROM tmp_table;",ИТ_Проверка); ИТ_Проверка.ВыбратьСтроку(); |
|||
1
Torquader
16.11.16
✎
19:29
|
Проще сделать вручную, то есть через ADODB выполнить запрос INSERT и передать параметры через подготовку запроса
Db=CreateObject("ADODB.Command"); Db.ActiveConnection=ConnectionToSql; Db.CommandType=1;// обычный текст Db.CommandText="INSERT INTO tmp_table(ID)VALUES(?)"; Db.Parameters.Item(0).Value=5; Db.Execute(); Db=CreateObject("ADODB.Command"); Db.ActiveConnection=ConnectionToSql; Db.CommandType=1; Db.CommandText="SELECT * FROM tmp_table"; R=Db.Execute(); R.MoveFirst(); Сообщить("Результат:"+R.Fields.Item(0).Value); R.Close(); как-то так. |
|||
2
Maximich
16.11.16
✎
19:35
|
(1) вручную то можно, но 1cpp дает возможность получать результаты сразу в ТЗ или ИТ. Что намного удобней.
ИТ_Проверка=СоздатьОбъект("ИндексированнаяТаблица"); RS.ВыполнитьИнструкцию("SELECT * FROM tmp_table;",ИТ_Проверка); ИТ_Проверка.ВыбратьСтроку(); + при выгрузке у меня может быть 10-20 тыс запросов. они конечно отработают, но ... |
|||
3
Torquader
16.11.16
✎
20:48
|
Я просто когда сталкивался с работой ADODB, то часто оказывалось, что там типы данных немного другие нежели те, которые ожидаются - если число оказывается в 8 байт, то система для передачи в 1С его переведёт в Double - и что там с ним будет - одному богу известно.
И - зачем результат пихать в таблицу, если есть объект RecordSet, по которому можно перемещаться как по таблице (MoveNext, MoveFirst и т.п.) ? |
|||
4
ADirks
17.11.16
✎
06:15
|
а int(8) - это правильно вообще?
может просто int? или bigint, если оч хочется |
|||
5
Maximich
17.11.16
✎
10:15
|
(4) А без разницы. Скажем так INT(3) означает какой ширины будет столбец при просмотре.
|
|||
6
Maximich
17.11.16
✎
10:18
|
P.S.
Проблема решилась перестановкой строк: RS.Подготовить("INSERT INTO tmp_table (id) VALUES(?);"); RS.ДобПараметр(1,4,8,0); Иногда прочтение документации вредно для здоровья. Не все что там написано является правдой. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |