Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Caracteres chinos en Firebird (https://www.clubdelphi.com/foros/showthread.php?t=67142)

erickahr 31-03-2010 19:57:43

Caracteres chinos en Firebird
 
Hola, antes que nada gracias de antemano por su atencion, mi problema es el siguiente:

Tengo que desarrollar un proyecto cuya interfaz y datos muestren caracteres chinos, 欢迎参加第七届中青年呼吸医师论坛, el asunto de la imterfaz lo tengo resuelto con el delphi 2009, me permite escribir captions en chino.

Ahora el problema es con la Base de datos utilizo Firebird, y no he podido almacenar correctamente este tipo de letras, e definido el charset=UTF8, Big5, ChineseBig5, etc.... pero al hacer el commit solo me muestra signos de interrogacion, alguien me puede ayudar?

guillotmarc 01-04-2010 19:21:02

Hola.

Piensa que esta definición la tienes que hacer en dos sitios. Primero en la base de datos, al crearla, y después en el componente Delphi que utilices para conectarte a Firebird.

Asegúrate de que tu base de datos tiene los campos con charset unicode (UTF8). Posiblemente tengas que volver a crear la base de datos, con IB-Expert es muy sencillo hacerlo, vas a Tools -> Extract Metadata, y le indicas de hacer un Script con todos tus objetos y datos.

Eso te va a generar un archivo de Script para regenerar la base de datos, una de las primeras instrucciones es el CREATE DATABASE, allí asegúrate de modificar el DEFAULT CHARACTER SET para que los campos de texto se creen con Unicode.

Saludos.

erickahr 01-04-2010 19:33:22

Otra cuestion...
 
Gracias por tu pronta respuesta... ya he podido almacenarlos en la base de datos.... ahora mi problema es a la hora de tratar de recuperar los datos de la misma.... utilizo los componentes de InterBase que vienen con el delphi 2009, (InterBase Express 12.12), y cuando abro una consulta select en el IBDataSet, IBQuery o IBTable, me da un error que dice 'Division by Zero'; esto solo pasa con estos tres componentes, si utilizo el IBSQL me recupera bien los valores de los campos (respetando los caracteres chinos). pero como sabes este IBSQL, no permite desplazarte con un .First, .Last, .Prior, ni asignarlo como Dataset a un DataSource para ponerlo en una Grid...

estoy intentando recuperarlos con los DBExpress, pero resulta que los Dataset de este son Unidireccional (por ende tampoco puedo ver los datos en una rejilla). Podiras ayudarme al respecto?

P.D. el 'Division by zero' solo me lo da cuando jalo los campos VarChar usando el UTF8, si jalo solo campos numericos o de otro tipo, no hay problema

guillotmarc 01-04-2010 20:20:12

Lamentablemente no conozco los IBExpress, pero utilizar dbExpress es muy sencillo (por eso lo utilizo en bastantes programas).

Como bien dices no puedes conectar directamente una grid a un SQLQuery, para hacerlo necesitas poner un ClientDataset de intermediario. NOTA: Necesitas también un DatasetProvider para actuar de intermediario entre el SQLQuery y el ClientDataset. Ambos componentes se encuentran en la pestaña "Data Access".

En definitiva el SQLQuery no hace más que leer los datos de la base de datos.

Se añade un DatasetProvider para poder pasar esos datos a un ClientDataset.

Finalmente se añade un ClientDataset que mantiene esos datos en memoria, por lo que puede hacer movimientos .Next, .Prior, .etc. ..., y por lo tanto se puede conectar a la Grid.

Es un poco engorroso puesto que tienes que añadir dos componentes más de lo normal, pero es muy útil, y al final tienes los datos en un ClientDataset que es un componente fantástico, y tiene muchas opciones para manejar tus datos en memoria (aplicar filtros, mantener campos de agregado, etc. ...).

Saludos.

erickahr 01-04-2010 23:36:32

Excelente!
 
Muchas gracias!!! ha sido una excelente solucion... lo he realizado como me comentas y funciona del uno... probablemente mas adelante te moleste de nuevo, pero de momento ya quedo... dejo mi codigo de conexion por si a alguien le sirve de algo:

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
With Cnn.Params do
  begin
  Add('DriverName=Interbase');
  Add('Database=C:\CHINOFUNCA.NEW');
  Add('RoleName=RoleName');
  Add('User_Name=sysdba');
  Add('Password=masterkey');
  Add('ServerCharSet=UTF8');
  Add('SQLDialect=3');
  Add('ErrorResourceFile=');
  Add('LocaleCode=0000');
  Add('BlobSize=-1');
  Add('CommitRetain=False');
  Add('WaitOnLocks=True');
  Add('Interbase TransIsolation=ReadCommited');
  Add('Trim Char=False');
  end;
Cnn.Connected:=True;
DSet.SQLConnection:=Cnn;
DSet.CommandText:='Select * From New_Table';
DSet.Active:=True;
DSPrvdr.DataSet:=DSet;
CDst.ProviderName:='DSPrvdr';
CDst.Active:=True;
DSrc.DataSet:=CDst;
DBGrid1.DataSource:=Dsrc;
end;

* Cnn: TSQLConnection.
* DSet: TSQLDataSet.
* DSPrvd: TDataSetProvider.
* CDst: TClientDataSet.
* DSrc: TDataSource.

Nueva mente Gracias!!!


La franja horaria es GMT +2. Ahora son las 07:39:39.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi