|
v7: MySQL / 1c++ / ВыполнитьSQL_ИзТЗ - Передача числового параметра в запрос |
☑ |
0
Maximich
16.11.16
✎
19:15
|
Добрый день.
Помогите разобраться с проблемой. ODBC драйвер 5.3. Устанавливаю соединение с сервером MySQL. Подключаюсь к базе. Создаю временную таблицу. И пытаюсь туда из ТЗ залить данные. Ошибок нет. Все отлично. Но когда пытаюсь сделать запрос к этой таблице. Вместо чисел возвращаются нули. При этом текст выгружается нормально. Перепробовал уже все подходящие типы из
Результата также ноль.
Пример кода:
ТЗ=СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("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);
Иногда прочтение документации вредно для здоровья. Не все что там написано является правдой.
|
|
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший