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
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.)
Обратите внимание, что Read не гарантирует результат 100%, как предполагается в Вашем коде.
SqlDB писал(а):
PROCEDURE (t: Table) Read (row: INTEGER; VAR data: ANYREC)
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}
P.S. Док-я по Sql переведена.

Автор:  Илья Ермаков [ Среда, 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/