Closing the database opened with FOpen

This forum is for eXpress++ general support.
Message
Author
User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: Closing the database opened with FOpen

#11 Post by Eugene Lutsenko »

Did as you said (almost), and it worked! Thank you very much! I will now use this instead of his makeshift goal.

The documentation "forgot" to specify quotes in the expression:
USE Test VIA SDFDBE

DbInfo () I need to, as I fairly standard default settings.

DbeBuild () is a DBESYS ().

In DBESYS () the only thing that I did - changed. F. to. T.:

LOCAL aDbes := { { "DBFDBE", .T.},;
{ "NTXDBE", .T.},;
{ "DELDBE", .F.},;
{ "SDFDBE", .T.} } // <=== .F. to .T.

Testing the performance showed that velocity is the same as with dbf.

The documentation states that sdf-file and the number of fields in which only really limited computer hardware.
But really it was 4 GB and artisanal method was 230Gb.
Measured the length of the string in the database soda. It turned out to be about 31,000 characters. This is considerably less than it should be at 100,000 fields. Perhaps you need to set specific parameters sdf-file or have to give them up.

Create a blank database cdf-100000 fields on 100,000 records took 25 minutes, and my makeshift method - 34 minutes

Code: Select all

#include 'dmlb.ch'
#include 'SdfDbe.ch'

PROCEDURE AppSys
   // Рабочий стол остается окном приложения
RETURN

DbeSys()        // Подключение механизмов баз данных

******************************************************************
FUNCTION Main()

LOCAL Getlist := {}, oProgress, oDialog

DC_IconDefault(1000)

*DbeSetDefault( "DBFNTX" )
*DbeBuild( "SDFNTX" , "SDFDBE" , "NTXDBE" )

**** Определение максимальной длины текстовой переменной для строки базы данных
**mTXT = ""
*DO WHILE .T.
*    mTXT = mTXT + REPLICATE("#",1000000)
*ENDDO
* Оказалось текстовая переменная может содержать до 282 млн.символов. Этого более чем достаточно

N_Cls   = 100000               // Число классов
N_Rec   = 100000               // Число признаков

N_Col   = N_Cls+5          // Число полей

********** Структура создаваемой базы

aStructure := { { "Kod_pr", "N", 15, 0},;     // 1
                { "Name"  , "C", 15, 0} }     // 2
FOR j=1 TO N_Cls
    FieldName = "N"+ALLTRIM(STR(j,15))
    AADD(aStructure, { FieldName, "N", 19, 2 })
NEXT
AADD(aStructure, { "Summa", "N", 19, 2 })
AADD(aStructure, { "Sredn", "N", 19, 2 })
AADD(aStructure, { "Disp" , "N", 19, 2 })

**************************************

IF FILE("TestSDF.txt");ERASE("TestSDF.txt");ENDIF
DbCreate( "TestSDF", aStructure, "SDFDBE" )   // Создать БД с использованием механизма SDF 

CLOSE ALL
USE TestSDF EXCLUSIVE NEW VIA 'SDFDBE'        // Открыть с использованием механизма SDF 

******* Эксперимент по определению скорости обращения к базам данных TXT и  DBF

****** Создание пустой sdf-базы *************

nMax  = N_Rec
Mess = 'Создание файла'
@ 4,5 DCPROGRESS oProgr SIZE 80,1.1 MAXCOUNT nMax COLOR GRA_CLR_CYAN PERCENT EVERY 100
DCREAD GUI TITLE Mess PARENT @oDial FIT EXIT
oDial:show()

nTime = 0

DC_GetProgress(oProgr,0,nMax)

nTimeON := SECONDS()
SELECT TestSDF
FOR i=1 TO N_Rec
    APPEND BLANK
*   FieldPut( 1, i         )                  // Запись поля в БД (корректная)
*   FieldPut( 2, STR(i,15) )                  // Запись поля в БД (корректная)
*   FOR j=3 TO N_Col
*       FieldPut( j, i*10000+j )              // Запись поля в БД (корректная)
*   NEXT
    DC_GetProgress(oProgr, ++nTime, nMax)
NEXT
DC_GetProgress(oProgr,nMax,nMax)

nTimeOFF := SECONDS()

MsgBox("Время исполнения="+ALLTRIM(STR(nTimeOFF-nTimeON))+" сек.")
oDial:Destroy()

CLOSE ALL

RETURN NIL


//////////////////////////////////////////////////////////////////////
//
//  DBESYS.PRG
//
//  Copyright:
//      Alaska Software, (c) 1998-2009. All rights reserved.         
//  
//  Contents:
//      Xbase++ DatabaseEngine startup/preloader
//   
//  Syntax:
//      DbeSys() is called automatically at program start before the 
//      function MAIN.
//   
//////////////////////////////////////////////////////////////////////


#define MSG_DBE_NOT_LOADED   " database engine not loaded"
#define MSG_DBE_NOT_CREATED  " database engine could not be created"

*******************************************************************************
* DbeSys() is always executed at program startup
*******************************************************************************
PROCEDURE dbeSys()
/* 
 *   The lHidden parameter is set to .T. for all database engines 
 *   which will be combined to a new abstract database engine.
 */

*DbeBuild( "SDFNTX" , "SDFDBE" , "NTXDBE" )

LOCAL aDbes := { { "DBFDBE", .T.},;
                 { "NTXDBE", .T.},;
                 { "DELDBE", .F.},;
                 { "SDFDBE", .T.} }   // Поменял .F. на .T.

LOCAL aBuild :={ { "DBFNTX", 1, 2 } } 
LOCAL i

  /*
   *   Set the sorting order and the date format
   */
  SET COLLATION TO AMERICAN
  SET DATE TO AMERICAN

  /* 
   *   load all database engines 
   */
  FOR i:= 1 TO len(aDbes)
      IF ! DbeLoad( aDbes[i][1], aDbes[i][2])
         Alert( aDbes[i][1] + MSG_DBE_NOT_LOADED , {"OK"} )
      ENDIF
  NEXT i

  /* 
   *   create database engines 
   */
  FOR i:= 1 TO len(aBuild)
      IF ! DbeBuild( aBuild[i][1], aDbes[aBuild[i][2]][1], aDbes[aBuild[i][3]][1])
         Alert( aBuild[i][1] + MSG_DBE_NOT_CREATED , {"OK"} )
      ENDIF
  NEXT i
                 
RETURN

//
// EOF

Post Reply