Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-04-2008
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Question GetFieldNames no trabaja apropiadamente bajo dbExpress?,o el problema será Firebird?

Hola,

Alguién sabe como obtener, usando dbExpress en Delphi 2007, la lista de campos de una tabla, exactamente en el mismo orden en que ellos están definidos en la tabla ?.

Veamos, el método GetFieldNames devuelve la lista de campos de la tabla; pero, no necesariamente en el orden en el cual están definidos. En mi caso, el orden es vital porque se trata de un algoritmo que llena una tabla creando dinámicamente los queries requeridos (Insert, Update, etc) y cuyos datos provienen de otra aplicación, la cual los manda en el el orden en el que los campos fueron creados en la Base de Datos. Esta operación se aplica sobre numerosas tablas.

Ahora bien, esto funcionaba perfectamente bajo BDE; pero con dbExpress y Firebird se está presentando el problema. No me queda claro si es un error en el método a nivel de dbExpress o si el problema es el driver a Firebird?.

La solución debe funcionar independientemente del motor de Base de Datos que se esté usando

Alguién puede aportar una solución ?
Responder Con Cita
  #2  
Antiguo 02-04-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Nunca he utilizado Firebird, pero en SQL Server hay una tabla que se llama sysobjects y otra que se llama syscolumns. Que son tablas que almacenan toda la información referente a campos y tablas en toda la base de datos. Tal vez Firebird tenga algo similar y solo habría que hacer una consulta a esas tablas.
__________________

Responder Con Cita
  #3  
Antiguo 03-04-2008
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Gracias; pero la idea es una solución general

Cita:
Empezado por ContraVeneno Ver Mensaje
Nunca he utilizado Firebird, pero en SQL Server hay una tabla que se llama sysobjects y otra que se llama syscolumns. Que son tablas que almacenan toda la información referente a campos y tablas en toda la base de datos. Tal vez Firebird tenga algo similar y solo habría que hacer una consulta a esas tablas.
Hola,

Muchas gracias por el aporte; pero, necesito una solución general; es decir, algo que no dependa del motor de base de datos que se esté usando.

En últimas, la falla de driver Firebird no sería tan crítica porque simplemente cambiaría de motor y no tendría que codificar nada extra; pero, la preocupación grande la tengo es porque si el problema es con dbExpress se perdería la capacidad de trabajar rutinas genéricas y tocaría codificar individualmente para más de 70 tablas, una locura !!.

Muchos saludos
Responder Con Cita
  #4  
Antiguo 03-04-2008
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Smile Confirmado. Es un problema de dbExpress

Hola,

Después de hacer un seguimiento al código de implementación de dbExpress he podido determinar la causa del problema y es definitivamente un error de dbExpress, no del driver. Inicialmente, la lista de campos es obtenida correctamente; pero, antes de devolverla a la rutina que llama, el código de dbExpress relaiza un ordenamiento. Supongo que lo hicieron para satisfacer otros servicios de la rutina; pero no se percataron que en el caso de los campos de la tabla, el oden debe ser el que existe en la Base de Datos.

Voy a verificar si no hay ningún reporte en CodeGear y si no lo hay se los enviaré.

Lo bueno para mí es que como el código original funciona puedo escribir un parche.
Responder Con Cita
  #5  
Antiguo 03-04-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
¡Hola Rolando!

Hace tiempo que no te dejabas ver.

Normalmente, al hablar de un método, es muy aconsejable indicar la clase a la cual pertenece. No me queda claro si te refieres a TSQLConnection.GetFieldNames, a TDataSet.GetFieldNames o a TFields.GetFieldNames. Supongo que te refieres al primero.

Voy a echarle una mirada rápida (en Delphi 7)...

...Así, de bote pronto, pareciera un asunto del controlador (driver) de dbExpress.

Podrías ilustrarme en qué lugar del código está ese ordenamiento que mencionas. Siempre es de mi interés todo lo que tenga que ver con la VCL, y últimamente, por trabajar en Magia Data, me interesa todo lo relacionado a dbExpress y otros componentes de acceso a datos.

Un meta-abrazo.

Al González.
Responder Con Cita
  #6  
Antiguo 03-04-2008
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 20
keyboy Va por buen camino
Yo también supongo que se refiere a TSQLConnection. La revisión en Delphi 7 te va a llevar a pensar que Rolando se ha equivocado, pero no, en Delphi 2007, por extraño que parezca han puesto

Código Delphi [-]
ISList:= TWideStringList.Create;
try
  try
    ISList.BeginUpdate;
    ISList.Duplicates := dupIgnore;
    ISList.CaseSensitive := False;
    while not DataSet.Eof do
    begin
      ISList.Add(TPlatformField.AsWideString(NameField));
      DataSet.Next;
    end;
    ISList.Sorted := True;
  finally
    ISList.EndUpdate;
  end;
  try
    List.BeginUpdate;
    List.Clear;
    List.AddStrings(ISList);
  finally
    List.EndUpdate;
  end;
finally
  ISList.Free;
end;

cosa que realmente no entiendo el porqué. ISList es un objeto temporal y sus elementos se asignan inmediatamente después a la lista original List que se proporciona a GetFieldNames, de manera que no alcanzo a ver cuál podría ser la necesidad de ordenar la lista.

Bye
Responder Con Cita
  #7  
Antiguo 03-04-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Vaya, muy interesante ilustración Keyboy (me gustaría llamarte por tu nombre si no te importara en algún momento hacerlo público).

Tal parece que este es uno de los nuevos cambios en dbExpress.

A mí también me extraña el por qué ordenar la lista de nombres.

Quizá Andreano Lanusse pueda respondernos a esta duda. Alguna razón debieron tener.

Saludos.

Al González.
Responder Con Cita
  #8  
Antiguo 03-04-2008
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Smile Efectivamente, es el error que muestra Keyboy

Hola,

Veo que han interpretado muy correctamente lo que descubrí.

Ciertamente, el problema es esa línea de

Código Delphi [-]
ISList.Sorted := True;

Como dije, busqué en CodeGear y no encontré reporte del problema por lo que he procedido a crear uno, incluso sugiriendo la solución.

Pienso que el problema pudo ocurrir porque la rutina que contiene a esa línea es utilizada para otros servicios. En general, lo que hace es recuperar información de esquema, así que supongo que lo necesitaban para algún otro servicio y no tuvieron en cuenta el caso en que se solicitan los campos en el orden en que aparezcan en la base de datos.

De todas formas, no es una explicación muy satisfactoria porque lo más lógico es devolver las cosas en el orden natural de las mismas. Si luego se requieren en orden alfabético la rutina que las llama solo necesita hacer el "sort". En cambio, como están las cosas, no hay forma de obtener los datos en el orden natural.

En mi caso, lo que estoy haciendo es basarme en el código de ellos para escribir un parche, porque, a decir verdad, no le tengo mucha confianza a corregir sqlExpr y recompilar.

Al, he estado super ocupado con el proyecto y por eso he escrito muy poco, usualmente solo cuando tengo un problema. Ahora estoy en la etapa final y empiezo a tener más tiempo. No he olvidado la explicación detallada de por qué la mejor solución al problema con el BDE era reemplazarlo directamente. Espero escribir pronto al respecto

Muchos saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Hay beneficio en migrar BDE a DBExpress bajo esta metodolgía ? rolandoj Conexión con bases de datos 10 30-08-2007 20:08:07
Delphi 5.0 trabaja con Firebird ó MySQL? ingechile Conexión con bases de datos 2 24-11-2004 21:52:41
Conectar Firebird bajo entornos Windows santiago14 Firebird e Interbase 3 22-07-2004 11:25:04
Crear Base de Datos en Firebird bajo Linux red hat 9 Choclito Firebird e Interbase 1 19-07-2004 08:40:50
conectar Firebird bajo entorno windows djavier22 Firebird e Interbase 2 05-07-2004 20:10:07


La franja horaria es GMT +2. Ahora son las 20:22:49.


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
Copyright 1996-2007 Club Delphi