Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2018, 13:00   #1
hron66
Пользователь
 
Регистрация: 21.09.2012
Сообщений: 20
По умолчанию Delphi неверно считывает поля Bool из базы PostgreSQL

Добрый день.
Столкнулся с непонятной проблемой.
Создал базу в PostgreSQL.
Код:
CREATE TABLE testable (
	tid bigserial NOT NULL,
	q1 timestamp NULL,
	q2 bool NULL,	
	q3 bit(1) NULL,
	CONSTRAINT testable_pk PRIMARY KEY (tid)
);
Потом написал простенькую программу в Delphi 2007 для теста.
Соединяюсь с БД через ADO, драйвер ODBC обычный 32-х битный.
При попытке прочитать поля bool или bit(1) в Delphi независимо от значения в БД результат запроса выдается False (это если их считывать AsBoolean). А если их считывать AsInteger, то все корректно работает, считывается то, что в БД. Причем я по всякому пробовал менять настройки подключения ODBC, но ничего не помогло.
Помогите пожалуйста разобраться. Код прилагаю.
Код:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls;

type
  TForm1 = class(TForm)
    ADOCon: TADOConnection;
    Button1: TButton;
    procedure FormShow(Sender: TObject);
    function ConnectDB: integer;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;  

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
   ConnectDB;
end;

procedure TForm1.Button1Click(Sender: TObject);
var Q: TADOQuery;
    q1: TDateTime;
    q2: Boolean;
    q3: Boolean;
    q4: Integer
begin   
   Q:=TADOQuery.Create(Self);
   Q.Connection:=ADOCon;
   try
      Q.SQL.Text:='SELECT q1,q2,q3 FROM testable where tid=2';
      Q.Open;
         q1:=Q.FieldByName('q1').AsDateTime;         
         q2:=Q.FieldByName('q2').AsBoolean;
         q3:=Q.FieldByName('q3').AsBoolean;
         q4:=Q.FieldByName('q3').AsInteger;
      Q.Close;
   finally
      Q.Free;
   end;   
end;

function TForm1.ConnectDB: integer;
begin
   result:=0;
   try
     ADOCon.Close;
     ADOCon.ConnectionString:='Driver={PostgreSQL Unicode};Server=localhost;Port=5432;SSLmode=disable;Database=postgres;Uid=postgres;Pwd=postgres;';
     ADOCon.LoginPrompt:=false;
     ADOCon.Open; 
   except
     result:=-1;
   end;
end;

end.
hron66 вне форума Ответить с цитированием
Старый 25.10.2018, 13:29   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Это как драйвера интерпретируют такой тип. Потяни явно поля датасета в код и посмотри какого типа field-ы будут созданы. Могу предположить что TSmallIntField
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.10.2018, 14:27   #3
hron66
Пользователь
 
Регистрация: 21.09.2012
Сообщений: 20
По умолчанию

Сделал то, что Вы посоветовали.
Результат удивил.
q1 - ftDateTime
q2 - ftString
q3 - ftWideString
Я так понимаю, драйвер булёвые поля интерпретирует как строки? А как-то можно заставить этот драйвер работать нормально? Или драйвер другой искать?
hron66 вне форума Ответить с цитированием
Старый 25.10.2018, 14:36   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Даже как строки. Ну а что мешает работать со строками? Там же наверняка '1' для истины, и, наверно, '0' для лжи. Не исключаю, что и в самой базе bool однобайтная строка. Искать другой драйвер? А их много odbc-шных для PostgreSQL? И никаких гарантий, что булев тип вернет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 25.10.2018 в 14:42.
Аватар вне форума Ответить с цитированием
Старый 26.10.2018, 13:02   #5
hron66
Пользователь
 
Регистрация: 21.09.2012
Сообщений: 20
По умолчанию

Да, судя по всему, только такой вариант - работать либо со String, либо c Integer. Про Boolean забыть.
hron66 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OS windows 7 ( Восстановление данных PostgreSQL после потери pg_control ) - PostgreSQL LWHS4356 SQL, базы данных 0 18.07.2018 14:56
Delphi+postgresql Wolworine БД в Delphi 3 14.05.2012 13:41
Перенос базы из MySQL в PostgreSQL по средствам php tematika PHP 3 09.08.2011 00:31
умножение матрицы на вектор на Delphi (неверно работает) adm2010 Помощь студентам 1 29.01.2011 01:43