Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

PARADOX DIRECTORY IS BUSY EN LOCAL USANDO CONFIGURACION RED

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: PARADOX DIRECTORY IS BUSY EN LOCAL USANDO CONFIGURACION RED Responder citando

Gracias de ante mano, Utilizo en mis aplicaciones en red habitualmente la siguiente configuracion sin problemas, usando paradox.

Declaro un componente TSesion, indicando siempre por ejemplo:
DM->sesi->PrivateDir = ".\\TMP\\";
DM->sesi->NetFileDir = "D:\\";

Siendo DM un data module y sesi el componente TSession, el netfile dir siempre uso el mismo para todos, caracter a caracter.

Todas las TTables y TQuerys usan la sesion que creo y para ello pongo el nombre de la sesion. Tambien en estas configuro el DatabaseName introducioendo la carpeta donde se encuentran las tablas paradox.

Hasta aqui siempre me ha funcionado bien en red sin ningun probema.

El problema surge cuando uso mas de 1 programa en el mismo pc, me acaba apareciendo el famoso directory is busy. Por ejemplo si ejecuto el programa 2 veces, el segundo en cargar falla (directory is busy) y aunque siempre me encargo de borrar los .lck y el .net, en este caso no tiene sentido ya q la aplicacion ya estaba abierta, es decir, no puedo abrir 2 veces la aplicacion a la vez en el mismo pc.

Además también me ocurre que puedo tener la aplicacion en distintas carpetas, en el mismo pc, e incluso otras aplicaciones que usen paradox corriendo en mi pc sin ningun problema, pero cuando tengo 2 aplicaciones mias corriendo sobre la misma base de datos, aunque esten en carpetas distintas, pero en el mismo pc, pasa lo siguiente:

Mi primera aplicacion carga bien, genera los lck y el .net.
La segunda carga bien, genera sus lck y en su private dir y funciona bien.
Pero si cierro la segunda aplicacion y la vuelvo a abrir, ERROR: directory is busy

y hasta que no cierro todas las aplicaciones que corren en paradox no vuelve a funcionar.

En resumidas cuentas usando pcs distintos no tengo problemas, pero usando mas de una aplicacion en el mismo me acaba saltando el error.

Huyo del componente TDatabase, lo he intentado usar pero siempre me da Param error, y no se si me solucionaria algo, tambien huyo de los aliases porque hasta ahora no me han echo falta, he estado mirando codigo por ahi en el foro, algo parecido a lo siguiente:

Código:

  delfile("D:\\*.net");  //borro los archivos .net si no estan en uso
  //delfile();
  AnsiString rutabd = "C:\\Archivos de programa\\Borland\\CBuilder6\\Projects\\tableisbusyoff\\BD\\";
  //DM->q1->Database = DM->DB;  //DB es un TDatabase que me daba errores y prefiero evitarlo
  MkDir("TMP");
  DM->sesi->PrivateDir = ".\\TMP\\";
  //DM->sesi->ConfigMode = cmSession;  //lo quite porque me fallaba a veces, no se porque al llegar aqui crea un c:\PDOXUSRS.NET
  DM->sesi->NetFileDir = "D:\\";
  DM->sesi->AddStandardAlias("miAlias", rutabd, "PARADOX"); //creo un alias, no se para que porque no me ayuda en nada
  DM->sesi->Active=true;  //activo la sesion
  //DM->DB->Connected=true;  //lo he quitado porque me daba errores
  DM->sesi->OpenDatabase(rutabd); //en este caso necesito esto

  DM->q1->DatabaseName = "miAlias";
  DM->q1->SQL->Text = "select * from T_Personal";
  DM->q1->Active=true; //funciona tal y como tengo el codigo




Este codigo funciona pero malamente, si abro 2 veces obtengo directory is busy.

si abro 2 veces la aplicacion pero en carpetas distintas obtengo un error nuevo con el que no contaba : Name not unique in this context.

¿Algun maestro del paradox que me pueda ayudar porfavor?

Lo que necesito es que mis programas funcionen en red sin problemas dentro del mismo pc, Ya cuando puedo me escapo a sqlserver, pero mis aplicaciones antiguas estan hechas en paradox.

Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Yo tuve el mismo problema, lo he solucionado poniendo el siguiente codigo en el ONCREATE de mi datamodule.

void __fastcall Tdm::dmCreate(TObject *Sender)
{
#define KEY_INSTANCIA "Instancia"

AnsiString exename = ExtractFilePath(Application->ExeName);

AnsiString rkey = REGWIN_Leer(KEY_INSTANCIA); // lee instancia
if ( rkey.Length()==0 )
rkey = "0"; // si no existia la pone en cero

rkey = ( StrToInt(rkey)==0 ? "1" : "0" ); // cambia 0 x 1 o 1 x 0
REGWIN_Grabar(KEY_INSTANCIA, rkey); // graba nuevo rkey

TIniFile *pDBIni = new TIniFile( exename + "\\GestCred.ini" );

db->Connected = false; // desconecto la DB
Session->Active = false; // tambien la session

// establezco private dir
Session->PrivateDir =
pDBIni->ReadString("PRIVATEDIR", "PDIR", "C:\\windows\\temp" );

if ( rkey=="1" ) // si es la segunda instancia
{ // le agrego un nivel al Private Directory
Session->PrivateDir = Session->PrivateDir + "\\2";
if ( !DirectoryExists(Session->PrivateDir) ) // no existe ?
ForceDirectories(Session->PrivateDir); // LO CREA ...
}

Session->Active = true; // ahora conecto la session y la DB
db->Connected = true;


A continuacion las definiciones de REGWIN_Grabar
y REGWIN_Leer. Que las he tomado de las colaboraciones
de este foro.
//---------------------------------------------------------------------------
void REGWIN_Grabar(AnsiString clave, AnsiString valor)
{
#define KEY_CLAVE "Software\\GestionCreditos"

TRegistry *rg = new TRegistry;
rg->RootKey = HKEY_CURRENT_USER;

if ( rg->KeyExists( KEY_CLAVE ) )
rg->CreateKey( KEY_CLAVE );

rg->OpenKey(KEY_CLAVE,true);

rg->WriteString(clave,valor);

delete rg;
}
//---------------------------------------------------------------------------
AnsiString REGWIN_Leer(AnsiString clave)
{
AnsiString valor = "";
TRegistry *rg = new TRegistry;
rg->RootKey = HKEY_CURRENT_USER;

if ( rg->KeyExists( KEY_CLAVE ) )
{
rg->OpenKey(KEY_CLAVE,true);

valor = rg->ReadString(clave);
}
delete rg;

return valor;
}


----------------------------
En sintesis, cuando entra la segunda instancia cambia el PRIVATEDIR de la Session. La misma tecnica la puedes mejorar para permitir que el usuario pueda abrir el programa la cantidad de veces que quiera.
Particularmente, prefiero que NO lo haga.
Saludos amigo !! Very Happy
_________________
Luis Anibal Mendez
Analisis, Programacion, Asesoramiento
luisanibalmendez@gmail.com
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

vale el tema consiste en cambiar el private dir, como bien dices, para que no coincida y no se bloquee, pero es que yo tengo el problema aunque esten en carpetas distintas, es decir, mis private dir son distintos, ya he explicado arriba como hago me conecto a la base de datos usando solo TSesion, TTable y TQuery.

No uso ni alias ni el componente TDatabase, como ya explique el TDatabase me pide parametros y contraseñas que no se darle.

Me gustaria saber como hace la gente exactamente para crear sus aplicaciones bde en red sin tener los problemas que yo tengo, que en resumidas cuentas es abrir varias de mis aplicaciones bde, sean cuales sean en el mismo pc, que es cuando acabo obteniendo el Table is Busy.

Gracias por contestar.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Cita:
No uso ni alias ni el componente TDatabase, como ya explique el TDatabase me pide parametros y contraseñas que no se darle.

Hasta que he empezado a usar Oracle o Firebird usaba siempre TDatabase y TSession y nunca he tenido que darle a TDatabase ningún aprámetro del tipo usuario y/o clave. Mira a ver si te vale la respuesta que di en Necesito Ayuda con Paradox. Básicamente el código es este:
Código:
Session1->PrivateDir = cDirectorio;
Session1->ConfigMode = cmSession;
Session1->NetFileDir = cAcceso;

try
{
     Session1->AddStandardAlias("Alias", cTablas, "PARADOX");
}

catch(...)
{
}

// Se activan la sesión, la base de datos

Session1->Active     = true;
Database1->Connected = true;
Session1->OpenDatabase(Database1->DatabaseName);

// Se abren las tablas

Table1->Open();
Table2->Open();

Y al terminar la aplicación:
Código:
// Cerramos las tablas

Table1->Close();
Table2->Close();

if (fTablas->Session1->IsAlias("Alias"))
{
     try
     {
          fTablas->Session1->DeleteAlias("Alias");
     }

     catch(...)
     {
     }
}

fTablas->Session1->DropConnections();
fTablas->Session1->Active     = false;
fTablas->Database1->Connected = false;

A pesar de todo esto, a veces se quedan pillado algún fichero de los que crea la aplicación para su gestión (PDOXUSRS.NET y otro, de extensión LCK, que ahora no recuerdo como se llama); basta con cerrar bien el programa. Lo que comentas de Directory is busy me ocurre alguna vez, pero lo mismo: con cerrar bien todas las aplicaciones que tiran del BDE se suele solucionar; me pasa, sobre todo, cuando estoy depurando un programa.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

siempre borro los lcks, y ya he probado ese codigo, pero algo he de hacer mal o algo me falta porque si no no lo entiendo, en el codigo que puse ya se ve que he utilizado ese ejemplo, pero gracias por responder.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Re: PARADOX DIRECTORY IS BUSY EN LOCAL USANDO CONFIGURACION Responder citando

ZHAX1 escribió:
Código:
DM->sesi->ConfigMode = cmSession;  //lo quite porque me fallaba a veces, no se porque al llegar aqui crea un c:\PDOXUSRS.NET

Ese fichero .net que te crea es el que se encarga de gestionar los permisos en la red; es necesario si quieres que la aplicación funcione en multipuesto.

El código que he puesto hoy está funcionando tal cual perfectamente en dos instalaciones: una en Toledo, con cuatro puestos, y otra en Ciudad Real con, al menos, dos. Me parece haber entendido al leer el código tuyo del primer mensaje que estás trabajando con Builder 6; el ejemplo que te he puesto es con Builder 5 y no sé si habrán diferencias entre uno y otro.

De todas formas, creo que complicas un poco el código. Deja EXCLUSIVAMENTE el código de "arranque"; todo lo demás (borrar ficheros, etc.) hazlo cuando acabes aunque no debería hacerte falta porque habría de ser automático. Por lo que he podido deducir DM es un TSession; entonces no sé que es sesi que aparece en todos los DM->. Si DM es TSession, debería funcionarte bien así:
Código:
DM->PrivateDir = cDirectorio;
DM->ConfigMode = cmSession;
DM->NetFileDir = cAcceso;

try
{
     DM->AddStandardAlias("miAlias", cTablas, "PARADOX");
}

catch(...)
{
}

DM->Active     = true;
DB->Connected = true;
DM->OpenDatabase(DB->DatabaseName);

Eso sí: Conservando el TDatabase, en el que habrás puesto en al propiedad DatabaseName es valor miAlias y en SessionName lo mismo que ponga en SessionName de Tsession; en mi código DatabaseName es dGestion y SessionName es sGestion, para no liarme.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Gracias, ya se para que sirve el pdoxusrs.net, hasta ahora eso se me creaba al activar el motor de la bd, en mi caso DM->Session->Active=true;

Cuando tenga un rato haré mas pruebas y trataré de simplificar todo al maxima y a ver que resultados obtengo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.