Имя: Пароль:
1C
1C 7.7
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);

Иногда прочтение документации вредно для здоровья. Не все что там написано является правдой.