FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Error al conectar Tabla con Intebase
Buenos dias estoy utilizando Delphi 6 con Firebird 1.5 y para acceso de datos estoy utilizando los componentes de DBExpress.
Estoy terminando una aplicación en donde uso los siguientes objetos pero por una determinada razon que desconosco este codigo no me funciona cada que trato de Abrir tablas, este error es aleatorio y casi siempre se presenta cuando trato de abrir una tablas despues de haber abierto cerrado 3 o 4 veces formularios. El mensaje de error que presenta es al Activar de SQLClientDataset (Project admi.exe raised exception class EdataBaseError with message 'SQLConection Proporty required for this operation' process stoped) alguien sabe el motivo de este mensaje. DIBcon : array [0..60]of TSQLConnection; DDataSource: array[0..99] of TDataSource; DSQLClientDataSet: array[0..60] of TSQLclientDataSet; Los cuales inicializo al inciar la aplicacion for vxii:= 1 to 60 do Begin principal.DIBcon[vxii] :=TSQLConnection.Create(self); principal.DSQLClientDataSet[vxii]:= TSQLclientDataSet.Create(self); principal.DSQLClientDataSet[vxii].Name :='dsqlcldata'+inttostr(vxii); principal.DDatasource[vxii]:= TDataSource.Create(self); principal.Dibcon[vxii].Connected :=false; principal.Dibcon[vxii].close; End; Estos los uso en la aplicación para conectar a cualquier Db de Firebird principal.DSQLClientDataSet[letraanumero].DBConnection:=principal.Dibcon[letraanumerotra]; Se valida que la conexion se realice a la ruta especifica y si no esta conectada lo conecta: IF (principal.Dibcon[letraanumerotra].Connected =false) or (UpperCase(principal.DSQLClientDataSet[letraanumero].DBConnection.Params.Values['Database'])<>UpperCase(srutadb)) then FConecta1DB(srutadb,letraanumerotra); Se cierra la tabla que se va a Abrir y se eliminan si existen campos asociados a la conexion: Principal.DSQLclientDataSet[vxt].Active := false; Principal.DSQLclientDataSet[vxt].close; for cuenta:= 0 to Principal.DSQLclientDataSet[vxt].FieldCount-1 do Begin Principal.DSQLclientDataSet[vxt].Fields[0].Destroy; end; Se arma el query principal.ddatasource[vxt].Enabled := fALSE; Principal.DSQLClientDataSet[vxt].CommandText := 'Select * from ' + tablaponerUso; principal.ddatasource[vxt].dataset:=Principal.DSQLClientDataSet[vxt]; Nuevamente se le asigna a la tabla la conexion Principal.DSQLclientDataSet[vxt].dbConnection :=principal.Dibcon[vxt2]; principal.DSQLClientDataSet[VXT].FieldDefs.Clear; Se abre la tabla principal.DSQLClientDataSet[vxt].Active := true; principal.DSQLClientDataSet[vxt].open; principal.ddatasource[vxt].DataSet :=principal.DSQLClientDataSet[vxt]; principal.ddatasource[vxt].Enabled := true; Al cerrar el Formulario se cierra la conexion Este proceso que realiza para abrir una tabla se hace cada que se abre una serie de 3 formularios. For conttemp:= 1 to 45 do Begin Principal.DSQLClientDataSet[conttemp].Active :=false; Principal.DSQLClientDataSet[conttemp].close; end; Principal.DSQLClientDataSet[2].IndexFieldNames :=''; Principal.DSQLClientDataSet[2].MasterFields:='' ; Principal.DSQLClientDataSet[2]:=Principal.DSQLClientDataSet[49]; ftransaccion(1,3);// Se termina la Transaccion que este iniciada fclosecon(1); //Se cierra la conexion principal.Dibcon[1]:=principal.Dibcon[49]; //la conexion se iguala a una conexion que nunca se toca. Si alguien conoce o tiene algun procedimiento manual de abrir y cerrar tablas con DBExpress se lo agradeceria ya que no se si me falta algo para poder abrir n numero de tablas, ya que parece que mi prodemiento falla. |
#2
|
||||
|
||||
Hola
¿ Existe alguna razón para tener 60 SQLConnections ?. A mi no se me ocurre ninguna. Lo habitual es tener una única conexión (en un DataModule), y que la utilizen todas las consultas y actualizaciones. NOTA: Además no sé porqué vas abriendo y cerrando las conexiones. De nuevo, lo habitual es abrir la conexión al arrancar el programa, y olvidarte de ella, es decir no cerrarla hasta no finalizar el programa. Otras observaciones : no hay ninguna necesidad de ir liberando los campos manualmente, puedes ejecutar el método Clear sobre la colección Fields. En mi opinión especificas demasiadas propiedades en tiempo de ejecución (Connection, Dataset, Datasource, ...) todo esto lo puedes hacer en tiempo de diseño. Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
|
|
|