PDA

Ver la Versión Completa : Turbo Delphi y Firebird???


b3nshi
01-08-2007, 23:27:22
Hola a todos! Resulta q desde q salio Turbo Delphi para win32 solo utilizo esta version de delphi, en la version explorer.

Y bueno... mi problema esta en q ahora estoy intentando conectarme a una base de datos Firebird... ya que no cuenta con la paleta de componentes para interbase...

Buscando por internet entontre este tutorial... el cual me llevo a lograr una conexion... pero a decir verdad no tengo idea de como utilizarla... se q se estableció pero nada mas... y bueno... quisiera saber q componentes usar desde esta version de delphi para conectarme... considerando el hecho de que no puedo instalar componentes de terceros...

Aqui dejo la web q encontre: Conexion Turbo Delphi con Interbase (http://www.felix-colibri.com/papers/db/interbase/turbo_delphi_interbase_tutorial/turbo_delphi_interbase_tutorial.html) (el sitio esta en ingles) y a decir verdad esta muy bien explicado... solo q al ser delphi .net en la version q utilizo no aparecen los componentes... por lo q me trabo al momento de utilizarlos... como puedo conectarme?

Desde ya les agradezco mucho si pueden ayudarme!

{Saludos}

FGarcia
02-08-2007, 00:57:18
Hace meses que no uso Firebird que ya se me esta olvidando lo poco que se.
Muy claramente dijiste que usas delphi for net. .NET usa nativamente ADO.NET para conectarse con BD's. Debes buscar en la pagina de Firebird algun componente que te permita desde delphi for net conectar a firebird. Ah! la instalacion de componentes de terceros creo que no se permite en los turbo personales solo en lo$ profe$ionale$

egostar
02-08-2007, 01:56:22
Yo recuerdo que cuando comence a usar turbo delphi en su version explorer, use los componente DBExpress, usa TSQLConnection con el drivername Interbase, generas la cadena de conexión y ya puedes usar TSQLTable, TSQLQuery, TSQLDataSet, etc...

Salud OS.

b3nshi
02-08-2007, 18:07:43
Asi es... algo asi estoy intentando hacer... por las dudas aclaro q uso Turbo Delphi Explorer no .net... o sea... el tuto era de .net... si logro conectarme les cuento como me fue y creo q voy a postear como hacerlo porq mucha ayuda no se encuentra sobre el tema... de todos modos muchas gracias por sus respuestas... me sirvieron mucho!:p

{Saludos}

egostar
02-08-2007, 18:22:34
Asi es... algo asi estoy intentando hacer... por las dudas aclaro q uso Turbo Delphi Explorer no .net... o sea... el tuto era de .net... si logro conectarme les cuento como me fue y creo q voy a postear como hacerlo porq mucha ayuda no se encuentra sobre el tema... de todos modos muchas gracias por sus respuestas... me sirvieron mucho!:p

{Saludos}

Realmente es sencillo conectarse a firebird con DBExpress de Turbo Explorer para Win32.

Vamos a crear una seudo-manual haber como nos queda:D:D


New project ---> VCL Forms Application
Pega un TSQLConnection, un TSQLTable, un DSDataSource y un DBGrid en la forma
En la propiedad ConnectionName del TSQLConnection asignas IBCONNECTION
Click en la propiedad Params del TSQLConnection y en el parámetro DataBase asignas la base de datos que ya debes de haber creado
En la propiedad SQLConnection del TSQLTable asigna el TSQLConnection
Asigna la tabla que deseas al TSQLTable
Ligas la TSQLTable al TDataSource
Ligas el TDataSource al TDBGrid
Listo, abres la tabla y verás la información en el DBGrid.

Salud OS.

egostar
02-08-2007, 18:51:31
:eek::eek::eek:

Creo que hay un bug :D en el seudo-manual, si uso un dbgrid me manda un error de que no puede conectarse a un dataset unidireccional, ya lo probé con el TSQLDataSet y me da el mismo error, pero si uso TDBEdit´s si me muestra los datos.

Alguien que nos ayude a convertir este seudo-manual en un manual:confused:

Salud OS.

eduarcol
03-08-2007, 15:00:42
Se vale un truco????

agregue un dasetprovider lo conecte al dataset, un clientdataset cree un datasource para este componente y se conecto perfectamente, sigo buscando soluciones a ver el porq de ese comportamiento

b3nshi
03-08-2007, 16:18:32
Creo que hay un bug :D en el seudo-manual, si uso un dbgrid me manda un error de que no puede conectarse a un dataset unidireccional, ya lo probé con el TSQLDataSet y me da el mismo error, pero si uso TDBEdit´s si me muestra los datos.


Bueno... el problema ahi es porq al sqltable no le estas asignando la propiedad mastersource con el datasource... y al datasource le estas asignando la propiedad dataset a la sqltable. Si no me equivoco cuando le asignes a los dos no te va a seguir apareciendo el problema...

Ahora mi problema esta en que logro "conectar" todos los componentes... pero cuando hago la asignacion al dbgrid este no me muestra los campos de la tabla q le asigné... alguien sabe porq?

Mientras sigo intentando... haber si logramos sacar de aqui un buen manual... :D :D y por cierto el seudo-manual esta bueno... digamo q es lo basico... ya vamos a ver si logramos hacerlo un manual...

{saludos}

b3nshi
03-08-2007, 16:21:55
A q nunca les paso esto jaja!! Se puso muy interesante esto... estaba viendo el porq no podia mostrar los campos en el dbgrid... y bueno... la cosa es q decidi cargarle yo manualmente los campos... pero lo mas interesante es q cuando le inserto una columna y le quiero asignar un campo por ejemplo... el campo nombre de mi tabla... Turbo Delphi se cierra!!! jajaja...

Alguien q sepa el porq?... sigo intentando solucionarlo:D

{Saludos}

b3nshi
03-08-2007, 17:08:29
Bueno... les cuento q con los q dijo eduarcol logre establecerla a la conexion... por supuesto q no lo hice solo... jajaja... en realidad busque por internet y encontré el metodo q el dice... por ahora voy a explicar los paso para la conexion... mas adelante ire descubriendo bien el porq de todas estas cosas... jajaja... y por las dudas... lo saque de una web de brazil...

Debemos insertar un SQLconnection, SQLDataSet, DataSetProvider, ClientDataSet y un DataSource.

SQLconnection
Login Prompt = False
Connected = True
Name = sqlconnection1
(Por supuesto q hay q establecer la conexion como lo veniamos haciendo)


SQLDataSet
SqlConnection = sqlconnection1
Name = sdstabla
CommandText = select * from TABLA
Active = False

(Le hacemos doble clic al componente y presionamos control+F y asi se agregar todos los campos)


DataSetProvider
Propriedade = Valor
dataset = sdstabla
Name = dsptabla

ClientDataSet
Propriedade = Valor
Providername = dsptabla
Name = cdstabla
Active = True

(Hay q adicionar todos los campos como se hizo con el SQLDataSet)

DataSource
Propriedade = Valor
DataSet = cdsTabla
Name = dsTabla

Finalmente solo se trata de insertar un dbgrid o donde quieran mostrar la info de la tabla y conectar con el data source... por las dudas si no les muestra los campos en el datasource insertenlo manualmente;)

Despues sigo completando! El q quiera puede seguir ayudando!
{Saludos}

eduarcol
03-08-2007, 18:25:53
Bueno a mi esa solucion me parece mas bien un truco :D:D:D:D

habria que ver el porq??

b3nshi
04-08-2007, 00:02:37
jaja... si puede ser... depende como lo veas... en realidad no encontre otra forma de establecer la conexion con las dbexpress... por lo q no creo q sea un truco... si se puede decir q es un metodo...

Ahora la cuestion es como hacer para agregar, modificar y eliminar registros de la tabla... alguna idea? o truco?...

Estoy intentando pero la verdad q ya no se como hacerlo... lo intente con:


sqltable1.append;
sqltable1.fieldbyname('').asstring := '' ; //Lo estoy escribiendo de memoria, por
//lo q puede haber algun error pero creo q se entiende cual es el metodo...

//Tambien lo intente haciendo uso de un query... pero no dio resultado...


Alguna idea:confused:
Gracias!!
{Saludos}

JosepGA
22-08-2007, 11:16:41
Hola, como bien dices es la forma de implementar el acceso a la base de datos con dbexpress, el ClientDataSet el el componente que te permite navegar con una tabla unidireccional a traves del DataSetProvider. Para guardar registros, en el momento que te interese, deberas llamar al metodo ApplyUpdates( nRegistrosConErroresPermitidos ) para que guarde los cambios realizados en el componente ClientDataSet (mirate la implementación del ReconcileError ). Tanto en el SQLDataSet como en el ClientDataSet, tendrás que indicar en las columnas de estos componentes (FieldColumns), cuales son los campos clave para la actualización (propiedad ProviderFlags, las tres primeras a TRUE, y en el resto de campos solo la primera a TRUE ). Tambien deberás aplicar los parametros pertinentes al DataSetProvider para permitir eliminación de registros en cascada, actualización de varios registros, etc...

Si quieres establecer una relación maestro-detalle, deberas conectar dos SQLDataSet mediante un DataSource y dos ClientDataSet, conectando el segundo al primero mediante su propiedad DataSetField, el cual es una columna del primer ClientDataSet ( al añadir las columnas en el ClientDataSet, el ultimo campo es del tipo ClientDataSet ). La sentencia SQL para el segundo SQLDataSet es del tipo siguiente:

SELECT * FROM TABLA2 WHERE CAMPOCLAVE = :CAMPOCLAVE ORDER BY CAMPOCLAVE2

la declaración :CAMPOCLAVE significa que agui tienes que poner el nombre del campo del SQLDataSet1 que se identifica con el del SQLDataSet2, al poner los dos puntos indicas que es un parametro que se recibe del SQLDataSet1 en forma de campo de la tabla y sin que tu lo tengas que especificar.

Espero que te aclare un poco el uso de DBExpress.

un saludo

b3nshi
03-09-2007, 07:03:16
Hola... de nuevo estuve retomando la idea de usar dbexpress, y bueno lo que hice fue insertar un sqlquery, en la propiedad sql, en tiempo de ejecucion le cargo la siguiente sintaxis:


sqlquery.sql.add(widestring('insert into PASCIENTES ( APELLIDO, NOMBRE, DIRECCION,
EDAD, NACIMIENTO, TELEFONO, SEXO) values (' + edit1.Text + ',' + edit2.Text + ','
+ edit3.Text + ',' + edit4.Text + ',' + edit5.Text + ',' + edit6.Text + ','
+ edit7.Text + ')');
sqlquery.active:= true;


Algo asi es el codigo, pero me aparece un error, por lo que no logro guardar los datos, no se si el error que me aparece sera importante de colocar, porq ni siquiera se si estoy haciendo bien las cosas... por eso si alguien cree q esta bien, entonces posteo el mensaje, y sino alguien puede ayudarme para guardar la info en una tabla?

Muchisimas Gracias!

{Saludos}

basti
03-09-2007, 11:52:09
Los campos que no sean numéricos debes ponerlos entre comillas


sqlquery.sql.add(widestring('insert into PASCIENTES ( APELLIDO, NOMBRE, ...) values (' + quotedstr(edit1.Text) + ',' + quotedstr(edit2.Text) + ... + ')');
sqlquery.active:= true;

b3nshi
03-09-2007, 17:02:37
Muchas Gracias Basti por la correccion, y evidentemente iba por ahi la cuestion, pero ahora tengo otro problema, me aparece el siguiente error:

'query: Cursor not returned from Query'

Por las dudas lo unico q cambie en mi TSQLQuery de las propiedades es la propiedad: SqlConnection, luego le dejo el active en false ya que no tiene ningun codigo ingresado en la propiedad sql...

Alguna idea?

Y tambien como hago para guardar una fecha?

Una vez mas muchas gracias!

{Saludos}