Prezados,

Estou tentado fazer funcionar o seguinte:

* Delphi 2007 conectando via DBExpress (não, obrigado, não vou trocar por
ZEOS)
* Delphi open source DbExpress driver for ODBC versão 3.201
(http://sourceforge.net/projects/open-dbexpress/)
* Driver ODBC versão 08.03.0300 (http://www.postgresql.org/ftp/odbc/)
* Postgres 8.3.4 instalado numa estação RWindows (sem nenhuma pretensão de
ser mais do que um servidor de testes para 3 estações)
* Um banco de dados criado com codificação UTF8 e client_encoding LATIN1 ou
UTF8 (os dois deram o mesmo problema)

Já consigo fazer 99% de tudo o que eu preciso, só falta contornar um bug com
parâmetros do tipo Unicode (ou UTF8): Encontro um problema quando tento
gravar um registro, via query INSERT INTO e valores parametrizados. Quando o
valor contido no parâmetro tem caracteres acentuados e o número de
caracteres é exatamente igual ao máximo permitido pelo campo (20 caracteres
num varchar(20)), o driver ODBC me retorna o erro "value too long for type
character varying", como se o campo tivesse caracteres a mais, só que na
realidade não tem, são apenas acentuados. Pelo que depurei, o DBExpress
passa a informação certa para o driver ODBC (caracteres corretamente
acentuados e tamanho da string=20). O mesmo comando com exatamente o mesmo
valor funciona corretamente quando o executo pelo PGAdmin. O erro que o driver
ODBC me retorna (texto montado pelo driver DBX) é o seguinte:

Error returned from ODBC function SQLExecute
ODBC Return Code: -1: SQL_ERROR

ODBC SqlState:        22001
Native Error Code:    7
ERROR: value too long for type character varying(20);
Error while executing the query

DBMS: "PostgreSQL", version: 8.3.4, ODBC Driver: "PSQLODBC35W.DLL", version:
08.03.0300

SQL:
insert into semaforo (semaforo,identificador,descricao,data_hora,usuario)
values ( ? , ? , ? , ? , ?  )

Parameters:
1 INPUT INTEGER: 3
2 INPUT VARCHAR: 'CTD-Proc. Integração'
3 INPUT VARCHAR: '00030002000000004102008000000001xxxxxxx'
4 INPUT TIMESTAMP: 2008-10-02 17:40:11.859000000
5 INPUT INTEGER: 1

Connection string:
DSN=Teste;DATABASE=Teste01102008143439;SERVER=192.168.1.10;PORT=5432;UID=sysdba;PWD=***;SSLmode=prefer;ReadOnly=0;Protocol=7.4-2;FakeOidIndex=0;ShowOidColumn=0;RowVersioning=0;ShowSystemTables=0;ConnSettings=;Fetch=1000000;Socket=4096;UnknownSizes=2;MaxVarcharSize=255;MaxLongVarcharSize=8190;Debug=0;CommLog=0;Optimizer=1;Ksqo=1;UseDeclareFetch=0;TextAsLongVarchar=1;UnknownsAsLongVarchar=1;BoolsAsChar=1;Parse=0;CancelAsFreeStmt=0;ExtraSysTablePrefixes=dd_;;LFConversion=1;UpdatableCursors=1;DisallowPremature=0;TrueIsMinus1=0;BI=4;ByteaAsLongVarBinary=1;UseServerSidePrepare=1;LowerCaseIdentifier=0;XaOpt=1

A estrutura da tabela é:

CREATE TABLE semaforo
(
  semaforo integer NOT NULL,
  identificador character varying(20),
  descricao character varying(250),
  data_hora timestamp without time zone,
  usuario integer,
  CONSTRAINT pksemaforo PRIMARY KEY (semaforo)
);

Alguém já passou por algo parecido ou faz idéia de como posso contornar
isso?


Mozart Hasse


_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a