OberonCore https://forum.oberoncore.ru/ |
|
Почему полученная из БД запись неверно интерпретиреутся? https://forum.oberoncore.ru/viewtopic.php?f=23&t=2041 |
Страница 1 из 1 |
Автор: | Виталий [ Среда, 11 Ноябрь, 2009 14:27 ] |
Заголовок сообщения: | Почему полученная из БД запись неверно интерпретиреутся? |
Получаю набор из БД MS SQL. Из поля типа int (4 байта) Вот код: Код: PROCEDURE EventBase(tab:SqlDB.Table;par:ANYPTR); VAR Запись:RECORD num:INTEGER; END; i:INTEGER; BEGIN IF tab.res=0 THEN StdLog.String('Получено '); StdLog.Int(tab.rows); StdLog.String(' строк');StdLog.Ln; (***********************************************) FOR i:=1 TO tab.rows DO tab.Read(i,Запись); (* StdLog.String(Запись.tab);*) StdLog.Int(Запись.num); StdLog.Ln; END; END; END EventBase; Это событие прикрученное Код: t.Exec('select kzaksl from zap'); t.Call(EventBase, NIL); Так вот проблема в том что в Запись.num чепуха приходит: Цитата: 6357059 6357059 6357059 6357059 6357059 Хотя в БД там в полях числа до 10 стоят. Вопрос: Как правильно получать записи из таблицы? |
Автор: | Евгений Темиргалеев [ Среда, 11 Ноябрь, 2009 14:36 ] |
Заголовок сообщения: | Re: Почему полученная из БД запись неверно интерпретиреутся? |
Виталий писал(а): Вопрос: Внимательно прочитать документацию.Как правильно получать записи из таблицы? Sql Subsystem Dev-Man писал(а): Design rules Обратите внимание, что Read не гарантирует результат 100%, как предполагается в Вашем коде.This section gives some rules which should be followed when designing a database application. The reason for each rule is given after the rule. Interactors or at least their types must be exported if they should be used as place holders in SQL statements. (Non-exported types are not accessible through metaprogramming, and thus controls and the SQL string translation mechanism could not be used with them.) SqlDB писал(а): PROCEDURE (t: Table) Read (row: INTEGER; VAR data: ANYREC) P.S. Док-я по Sql переведена.
NEW, ABSTRACT Reads the row'th row of the result table into the interactor data. ... Post t.res IN {0, converted, truncated, overflow, incompatible, noData} |
Автор: | Илья Ермаков [ Среда, 11 Ноябрь, 2009 14:36 ] |
Заголовок сообщения: | Re: Почему полученная из БД запись неверно интерпретиреутся? |
Насколько я помню... Поля у записи должны быть экспортированы. Т.к. SqlDB работает с записями через "обезопашенное метапрограммирование" (модуль Meta) и ниже не лезет. Экспортировать можно прямо "по месту" (т.е. VAR запись: RECORD num*: INTEGER END). |
Автор: | Виталий [ Среда, 11 Ноябрь, 2009 15:01 ] |
Заголовок сообщения: | Re: Почему полученная из БД запись неверно интерпретиреутся? |
Цитата: Обратите внимание, что Read не гарантирует результат 100%, как предполагается в Вашем коде. Что-то я не сильно понял эту фразу... Впрочем Interactors or at least their types must be exported кое что прояснило. Но: Код: VAR Запись:RECORD num*:INTEGER; END; На * пишет - illegaly marked identifier |
Автор: | Илья Ермаков [ Среда, 11 Ноябрь, 2009 15:07 ] |
Заголовок сообщения: | Re: Почему полученная из БД запись неверно интерпретиреутся? |
Пардон. Склероз подвёл. Или в какой-то из версий ББ это скользкое место пропало. Ну, просто глобальный тип объявите с экспортированными полями. Проблем-то ![]() Сам тип точно можно не экспортировать. |
Автор: | Виталий [ Среда, 11 Ноябрь, 2009 15:23 ] |
Заголовок сообщения: | Re: Почему полученная из БД запись неверно интерпретиреутся? |
Ага!!! Есть. Вынес Запись глобально и * поставил ей - сработало Терь понял как делать. Думаю тема закрыта. |
Автор: | Иван Кузьмицкий [ Среда, 11 Ноябрь, 2009 20:01 ] |
Заголовок сообщения: | Re: Почему полученная из БД запись неверно интерпретиреутся? |
Я обычно объявляю тип записи, которая неэкспортирована, но поля в ней экспортированы. Переменные для чтения результатов запроса делаю локальными. Ну, получается, что тип записи скрыт от остальных модулей. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |