Problema cargando BD DBF de 1.7 GB
Started by
enecumene
, Nov 03 2010 10:30 AM
6 replies to this topic
#1
Posted 03 November 2010 - 10:30 AM
Pues eso, al intentar cargar (Activar y/o cargar campos persistentes) en tiempo de diseño, Delphi se queda congelada mucho tiempo y al final no termina de conectarse, no he podido abrirlo para ver los campos y/o datos de dicha tabla, he usado ADO y un componente llamado TDbf y he obtenido el mismo resultado, qué debo hacer ante esta situación??
Saludos.
Saludos.
#2
Posted 04 November 2010 - 06:25 AM
...cargar campos persistentes...
wha?
...no he podido abrirlo para ver los campos y/o datos de dicha tabla...
Si no encuentras una solucion "común", lo comprimes con 7z y lo subes para que te una solucion extraordinaria (en ultimo caso, y si se puede, migramos).
#3
Posted 04 November 2010 - 07:22 AM
Hola Fernando,
¿Probaste abriendo la base de datos con alguna otra herramienta? ¿Antes la base de datos ya estaba funcionando bien?
Es para descartar que sea un problema de Delphi... quizá existe la posibilidad de que la base de datos esté dañada.
Saludos,
¿Probaste abriendo la base de datos con alguna otra herramienta? ¿Antes la base de datos ya estaba funcionando bien?
Es para descartar que sea un problema de Delphi... quizá existe la posibilidad de que la base de datos esté dañada.
Saludos,
#4
Posted 05 November 2010 - 10:49 AM
Hola Chack, pues lo de persistente es un término mío y de otros , lo de migrarnos no será factible porque pertenece a un software que utilizan en la compañía creado en FoxPro, al intentar abrirlo con el BDE ahora me dice que esa tabla está corrupta, cosa extraña ya que el sistema que maneja esos datos se muestran perfectamente, bueno ahora mismo estoy ejecutando DBF Doctor para reparar los daños y la bendita BD tiene 213 campos !!! hostia , ya les contaré los resultados.
Saludos.
Saludos.
#5
Posted 05 November 2010 - 11:06 AM
Hola,
Pues parece que mi presunción quizá no esté del todo errada Dios no quiera que esa DB esté hecha trizas
Tu lleva a ese bicho de 213 (¿no se pudieron inventar uno más ?) campos con el doc a ver si le pone una vacuna.
Saludos,
Pues parece que mi presunción quizá no esté del todo errada Dios no quiera que esa DB esté hecha trizas
Tu lleva a ese bicho de 213 (¿no se pudieron inventar uno más ?) campos con el doc a ver si le pone una vacuna.
Saludos,
#6
Posted 10 November 2010 - 07:14 AM
...al intentar abrirlo con el BDE ahora me dice que esa tabla está corrupta, cosa extraña ya que el sistema que maneja esos datos se muestran perfectamente...
Aunque no he probado con BDE, he notado un comportamiento fastidioso usando OLEDB y ODBC en un ADOTable. En ambos casos y por una razón que no me puse a analizar, al momento de abrir la conexión con tu BD, internamente hace algún tipo de caché que consume los recursos (memoria) como si fuera un producto de Microsoft. Aunque la RAM de mi equipo debería poder albergar dicha información en cierto momento aparece un Error no especificado.
En resumen; tu BD de 1.7 Gb. no tiene ninguna falla de integridad, es un problema interno de manejo de información que se puede solucionar utilizando directamente el Driver ODBC del Visual FoxPro, tal cual el siguiente ejemplo funcional que publico para futuras implementaciones;
delphi
uses Windows; // by cHackAll // [url]http://download.microsoft.com/download/vfoxodbcdriver/Install/6.1/W9XNT4/EN-US/VFPODBC.msi[/url] // Microsoft® Visual Foxpro® ODBC Driver, v6.1 (final release) uses the ODBC 2.0 Standards Compliance; // SQLAllocEnv, SQLAllocConnect, SQLAllocStmt, SQLFreeStmt, SQLFreeConnect and SQLFreeEnv are deprecated. function SQLAllocEnv(var hEnvironment: Integer): SmallInt; stdcall external 'vfpodbc'; function SQLAllocConnect(hEnvironment: Integer; var hConnection: Integer): SmallInt; stdcall external 'vfpodbc'; function SQLAllocStmt(hConnection: Integer; var hStatment: Integer): SmallInt; stdcall external 'vfpodbc'; function SQLDriverConnect(hConnection, hWnd: Integer; lpInConnectionString: PChar; cbStringLength1: SmallInt; lpOutConnectionString: PChar; cbBufferLength: SmallInt; lpStringLength2Ptr: PSmallInt; DriverCompletion: Word): SmallInt; stdcall external 'vfpodbc'; function SQLExecDirect(hStatment: Integer; StatementText: PChar; TextLength: Integer): SmallInt; stdcall external 'vfpodbc'; function SQLNumResultCols(hStatement: Integer; ColumnCountPtr: PSmallInt): SmallInt; stdcall external 'vfpodbc'; function SQLDescribeCol(hStatment: Integer; ColumnNumber: SmallInt; lpColumnName: PChar; cbBufferLength: SmallInt; NameLengthPtr, DataTypePtr: PSmallInt; ColumnSizePtr: PInteger; DecimalDigitsPtr, NullablePtr: PSmallInt): SmallInt; stdcall external 'vfpodbc'; function SQLFetch(hStatment: Integer): SmallInt; stdcall external 'vfpodbc'; function SQLGetData(hStatment: Integer; ColumnNumber: Word; TargetType: SmallInt; TargetValuePtr: PChar; BufferLength: Integer; StrLen_or_IndPtr: PInteger): SmallInt; stdcall external 'vfpodbc'; function SQLFreeStmt(hStatment, fOption: Integer): SmallInt; stdcall external 'vfpodbc'; function SQLDisconnect(hConnection: Integer): SmallInt; stdcall external 'vfpodbc'; function SQLFreeConnect(hConnection: Integer): SmallInt; stdcall external 'vfpodbc'; function SQLFreeEnv(hConnection: Integer): SmallInt; stdcall external 'vfpodbc'; var hEnvironment, hConnection, hStatment, Columns, hFile, Index, Size, uBytes: Integer; Buffer: array [0..1024*1024-1] of Char; lpBuffer: PChar; begin SQLAllocEnv(hEnvironment); SQLAllocConnect(hEnvironment, hConnection); if SQLDriverConnect(hConnection, 0, 'SourceType=DBF;SourceDB=c:\MyVFPdb', -3{SQL_NTS}, @Buffer, $7F, nil, 0{SQL_DRIVER_NOPROMPT}) = 0{SQL_SUCCESS} then begin SQLAllocStmt(hConnection, hStatment); SQLExecDirect(hStatment, 'select * from basediar', -3); SQLNumResultCols(hStatment, @Columns); hFile := 0; repeat Size := 0; uBytes := 0; lpBuffer := @Buffer; for Index := 1 to Columns do begin PCardinal(lpBuffer)^ := 8748; if hFile > 0 then SQLGetData(hStatment, Index, 1{SQL_C_CHAR}, @lpBuffer[2], SizeOf(Buffer), @Size) else SQLDescribeCol(hStatment, Index, @lpBuffer[2], High(SmallInt), @Size, nil, nil, nil, nil); while (Size > 0) and (lpBuffer[Size + 1] = ' ') do Dec(Size); Inc(Size, 3); Inc(uBytes, Size); Inc(lpBuffer, Size); lpBuffer[-1] := '"'; end; if hFile = 0 then hFile := _lcreat('basediar.txt', 0); PCardinal(lpBuffer)^ := $0A0D; _lwrite(hFile, @Buffer[1], uBytes + 1); until SQLFetch(hStatment) <> 0; SQLFreeStmt(hStatment, 1{SQL_DROP}); SQLDisconnect(hConnection); end; SQLFreeConnect(hConnection); SQLFreeEnv(hEnvironment); end.
Nótese en la línea 30 del proyecto que la cadena de conexión contiene la carpeta donde se alojan los Free Tables.
#7
Posted 10 November 2010 - 08:40 AM
Vaya, muchas gracias ChackAll, haré las pruebas de lugar