AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi 7 - BDE 32-Bit - Wie eine Datenbank und/oder Alias erstellen ?

Delphi 7 - BDE 32-Bit - Wie eine Datenbank und/oder Alias erstellen ?

Ein Thema von paule32.jk · begonnen am 3. Sep 2023 · letzter Beitrag vom 18. Okt 2023
Antwort Antwort
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
356 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Delphi 7 - BDE 32-Bit - Wie eine Datenbank und/oder Alias erstellen ?

  Alt 4. Sep 2023, 22:01
Hallo,
Danke Euch für Euer Feedback !
Ich habe mir aber mal erlaubt, doch mal bissl rumzubasteln und zu stöpseln ...
Es geht mir ja auch dadrum, eine Datenbank zu Haben, die von unbedarften Usern
installiert werden kann - Ihr wisst ja - GAUF - Größter Anzunehmender User Fehler...
Man braucht auch keine Admin Rechte, um die Registry zu wursteln, aber ich habe mal
im Code eine Abfrage eingetragen - sicher ist sicher ...
nur mal so, ein Snippet:
Delphi-Quellcode:
function isAdmin: Boolean;
const
  DOMAIN_ALIAS_RID_ADMINS = $00000220;
  SECURITY_BUILTIN_DOMAIN_RID = $00000020;
  SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5));
var
  Admin: Boolean;
  AdmGroup: PSID;
Begin
  Admin := AllocateAndInitializeSid(SECURITY_NT_AUTHORITY,
    2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
    0, 0, 0, 0, 0, 0, AdmGroup);
  If (Admin) Then
  Begin
    If (not CheckTokenMembership(0, AdmGroup, Admin)) Then
      Admin := False;
    FreeSid(AdmGroup);
  end;
  Result := Admin;
end;

// -------------------------------------------------------------
// rs_xxx are the Locale's .ENU, .DEU files. default is: ENU ...
// -------------------------------------------------------------
resourcestring
  rs_Internal_Error = 'internal error.';
  rs_BDE_notInstalled = 'No BDE Installation found !';
  rs_BDE_Error = 'BDE Error:';
  rs_BDE_AppStart_Rej = 'Aborted start.';
  rs_App_First_Run = 'You run this Application at first race !' + #13#10 +
                        'Would You do a Setup of needed Stuff ?';
  rs_App_User_Mode = 'You run this Application with User rights !'      + #13#10 +
                        'If You confirm this Dialog with "Yes", it can be' + #13#10 +
                        'that the Application does not work.'              + #13#10 +
                        '' + #13#10 +
                        'Would You start the Application without Admin rights ?';
  rs_ClassName = 'Class-Name: ';
  rs_Message = 'Message: ';
  rs_Exception_Error = 'Exception Error:';
  rs_File_Exists = 'The file already exists !' + #13#10 +
                        'Would you override the old Version ?';

  rs_BDE_EClassName = 'Error-Class: ';
  rs_BDE_ECode = 'Error-Code: ';
  rs_BDE_EMessage = 'Error-Message: ';
  rs_BDE_EFile = 'Error-File: ';
  rs_BDE_EModule = 'Error-Module: ';
  rs_BDE_EProc = 'Error-Proc: ';
  rs_BDE_ELine = 'Error-Line: ';

  rs_BDE_Error_TableDontExists = 'Table does not exists.';
  rs_Win32_Registry_Error = 'Win32-Registry Error:';

procedure TForm1.FormCreate(Sender: TObject);
const
  BDE_DLLs: array [0..2] of string = (
    'IDAPI32.DLL',
    'IDR20009.DLL',
    'IDR20009.DLL'
  );
  BDEAlias = 'DataBaseName';
  BDECoTbl = 'test.dbf';
  BDELevel = 0;
var
  I,J : Integer;
  text : WideString;
  xpos, ypos : Integer;
  row, col : Integer;
  S : String;
  B : Boolean;
  BDE_found : Boolean;
  Index : Integer;
  reg : TRegistry;
  H : HDBISes;
  letter1 : Char;
  letter2 : Char;
  buffer : Array[0..MAX_PATH] of Char;
  BDEList : TStringList;
  BDESession : TSession;
  BdeAdmin : TDataBase;
  BDETable : TTable;
  BDEQuery : TQuery;
  BDEDataSrc : TDataSource;
  SystemFolder: String;
  SQLstmt : String;
  stmtParams : TParams;


  procedure FreeBDESetup;
  begin
    if Assigned(BDEList) then
    begin
      BDEList.Clear;
      BDEList.Free;
      BDEList := nil;
    end;

    if Assigned(BDEQuery) then
    begin
      BDEQuery.SQL.Clear;
      BDEQuery.Free;
      BDEQuery := nil;
    end;

    if Assigned(BDETable) then
    begin
      BDETable.Close;
      BDETable.Free;
      BDETable := nil;
    end;

    if Assigned(BDEAdmin) then
    begin
      BDEAdmin.Close;
      BDEAdmin.Free;
      BDEAdmin := nil;
    end;

    if Assigned(BDESession) then
    begin
      BDESession.Close;
      BDESession.DeleteAlias(BDEAlias);
      BDESession.Free;
      BDESession := nil;
    end;

    if Assigned(reg) then
    begin
      reg.Free;
      reg := nil;
    end;

    if Assigned(h) then
    begin
      DBICloseSession(h);
      DBIExit;
      h := nil;
    end;
  end;
begin
  // -------------------------------------------------
  // first, check if the BDE is installed.
  // one step is, to locate the BDE Win32 Registry key
  // second step, try to locate per path.
  // -------------------------------------------------
  BDE_found := true;
  reg := Tregistry.Create;
  try
    try
      reg.RootKey := HKEY_LOCAL_MACHINE;
      B := reg.OpenKeyReadOnly('SOFTWARE\Borland\Database Engine');
      if not(B) then
      begin
        GetSystemDirectory(buffer, SizeOf(buffer));
        SystemFolder := StrPas(buffer);

        for I := Low(BDE_DLLs) to High(BDE_DLLs) do
        begin
          if not FileExists(SystemFolder + '\' + BDE_DLLs[I]) then
          begin
            BDE_found := false;
            break;
          end;
        end;
      end
    except
      on E: Exception do
      begin
        ShowMessage(rs_Win32_Registry_Error
        + #13#10 + rs_ClassName + E.ClassName
        + #13#10 + rs_Message + E.Message);
        FreeBDESetup;
        Close;
      end;
    end;
  finally
    FreeBDESetup;

    if not(BDE_found) then
    begin
      ShowMessage(
      rs_BDE_notInstalled + #13#10 +
      rs_BDE_AppStart_Rej);
      Close;
    end;
  end;

  // ------------------------------------
  // look, if database is present, if not
  // than try to create it ...
  // ------------------------------------
  BDEAdmin := TDataBase.Create(nil);
  BDE_found := false;
  try
    try
      S := ExtractFilePath(Application.ExeName);
      S := S + 'data';

      // -----------------------------------------
      // warn the user, if run with admin rights
      // if true then check data + password, else
      // continue as normal user.
      // -----------------------------------------
      if not(DirectoryExists(S)) then
      begin
        I := MessageDlg(rs_App_First_Run,
        mtWarning,[mbYes, mbNo],0);
        if I = mrNo then
        begin
          Close;
        end;
        if not(isAdmin) then
        begin
          I := MessageDlg(rs_App_User_Mode,
          mtWarning,[mbYes, mbNo],0);
          if I = mrNo then
          begin
            Close;
          end;
        end;

        CreateDir(S);
      end;

      // --------------------------------
      // check, if 'databasename' exists
      // --------------------------------
      if not(Assigned(BDEList)) then
      BDEList := TStringList.Create;
      BDEList.Clear;

      BDESession := TSession.Create(nil);
      BDESession.SessionName := BDEAlias;

      // no, then create it
      if BDEList.IndexOf(BDEAlias) < 0 then
      begin
        DBIInit(nil);
        DBIStartSession('dummy',h,'');
        DBIAddAlias(nil,
        PChar(BDEAlias),
        PChar('DBASE'),
        PChar('PATH=' + S),
        true);
        DBICloseSession(h);
        DBIExit;
        h := nil;
      end;

      // -------------------------------
      // sanity check ...
      // -------------------------------
      BDESession.Open;
      BDESession.GetDatabaseNames(BDEList);

      if BDEList.IndexOf(BDEAlias) < 0 then
      raise Exception.Create(
      'BDE Error:'   + #13#10 +
      'internal Error.');

      if not(Assigned(BDEAdmin)) then
      BDEAdmin := TDataBase.Create(nil);
      BDEAdmin.DatabaseName := BDEAlias;
      BDEAdmin.Directory := S;
      BDEAdmin.Open;

      try
        // -------------------------------
        // check, if data table exists ...
        // -------------------------------
        BDEQuery := TQuery.Create(nil);
        BDEQuery.DatabaseName := BDEAlias;
        BDEQuery.SQL.Text :=
        'SELECT COUNT(*) AS TableCount ' +
        'FROM SYSALIASES A ' +
        'INNER JOIN TABLES T ON A.PATH = T.PATH ' +
        'WHERE A.ALIASNAME = ''' + BDEAlias + '''' + ' ' +
        'AND T.TBLNAME = ''' + S + '\'  + BDECoTbl + '''' ;

        BDEQuery.Open;
      except
        on E: EDBEngineError do
        begin
          BDE_found := true;
          for I := 0 to E.ErrorCount - 1 do
          begin
            // table does not exists...
            if E.Errors[I].ErrorCode = 10024 then
            begin
              BDE_found := false;
              break;
            end;
          end;

          if not(BDE_found) then
          begin
            try
              BDEQuery.Close;

              BDEQuery.SQL.Clear;
              BDEQuery.SQL.Text :=
              'CREATE TABLE ''' + S + '\' + BDECoTbl + ''' (' +
              'COL1 int,' +
              'COL2 int)';

              BDEQuery.ExecSQL;
            except
              on E: EDBEngineError do
              begin
                for I := 0 to E.ErrorCount - 1 do
                begin
                  case E.Errors[I].ErrorCode of
                    0:
                    begin
                      // no error
                      break;
                    end;
                    10024,
                    13057:
                    begin
                      // table exists
                      break;
                    end else
                    begin
                      ShowMessage(rs_BDE_Error
                      + #13#10 + rs_BDE_EClassName + E.ClassName
                      + #13#10 + rs_BDE_ECode + IntToStr(E.Errors[i].ErrorCode)
                      + #13#10 + rs_BDE_EMessage + E.Errors[i].Message
                      + #13#10 + rs_BDE_EFile + FileByLevel (BDELevel)
                      + #13#10 + rs_BDE_EModule + ModuleByLevel(BDELevel)
                      + #13#10 + rs_BDE_EProc + ProcByLevel (BDELevel)
                      + #13#10 + rs_BDE_ELine + IntToStr(LineByLevel(BDELevel)));

                      FreeBDESetup;
                      Close;
                    end;
                  end;
                end;
              end;
            end
          end;
        end;
      end;

      // -------------------------------
      // sanity check ...
      // -------------------------------
      BDEList.Clear;

      BDEAdmin.DatabaseName := BDEAlias;
      BDEAdmin.Connected := true;

      if not(Assigned(BDESession)) then
      begin
        BDESession := TSession.Create(nil);
        BDESession.SessionName := BDEAlias;
      end;

      if not(Assigned(BDETable)) then
      BDETable := TTable.Create(nil);
      BDETable.DatabaseName := BDEAdmin .DatabaseName;
      BDETable.SessionName := BDESession.SessionName;
      BDETable.TableName := S + '\test.dbf';

    except
      on E: EDBEngineError do
      begin
        for i := 0 to E.ErrorCount - 1 do
        begin
          case E.Errors[i].ErrorCode of
            0: begin {no error} BDE_found := true; end;
            else begin
              ShowMessage(rs_BDE_Error
              + #13#10 + rs_BDE_EClassName + E.ClassName
              + #13#10 + rs_BDE_ECode + IntToStr(E.Errors[i].ErrorCode)
              + #13#10 + rs_BDE_EMessage + E.Errors[i].Message
              + #13#10 + rs_BDE_EFile + FileByLevel (BDELevel)
              + #13#10 + rs_BDE_EModule + ModuleByLevel(BDELevel)
              + #13#10 + rs_BDE_EProc + ProcByLevel (BDELevel)
              + #13#10 + rs_BDE_ELine + IntToStr(LineByLevel(BDELevel)));
            end;
          end;
        end;

        FreeBDESetup;
        Close;
      end;
      on E: Exception do
      begin
        ShowMessage(rs_Exception_Error
        + #13#10 + rs_BDE_EClassName + E.ClassName
        + #13#10 + rs_BDE_EMessage + E.Message
        + #13#10 + rs_BDE_EFile + FileByLevel (BDELevel)
        + #13#10 + rs_BDE_EModule + ModuleByLevel(BDELevel)
        + #13#10 + rs_BDE_EProc + ProcByLevel (BDELevel)
        + #13#10 + rs_BDE_ELine + IntToStr(LineByLevel(BDELevel)));

        FreeBDESetup;
        Close;
        exit;
      end;
    end
  finally
    FreeBDESetup;
  end;
end;
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet

Geändert von paule32.jk ( 4. Sep 2023 um 22:13 Uhr) Grund: isAdmin Funktion hinzugefügt
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.438 Beiträge
 
Delphi 12 Athens
 
#2

AW: Delphi 7 - BDE 32-Bit - Wie eine Datenbank und/oder Alias erstellen ?

  Alt 5. Sep 2023, 06:11
Moin...

...du hast nicht richtig gelesen / zugehört!
Zitat:
Es ist aber in der Tat so, dass das ganze BDE-Gedöns ab Windows Vista nicht mehr so wirklich funktioniert
.
.
.
Zitat:
Es geht mir ja auch dadrum, eine Datenbank zu Haben, die von unbedarften Usern installiert werden kann
Dann bist du mit er BDE erst Recht falsch! Die BDE muss auf jedem System, wo das Programm läuft, installiert sein.

Lösung: Firebird Embedded. Alternative: SQLite (kein MultiUser), andere DLL

* KEINE Installation der BDE beim Kunden...weil nicht gebraucht
* KEIN Registry Gedöns
* KEIN Admin Gedöns
* KEINE Serverinstallation nötig.
* Datenbank mit dem Programm mitliefern (eine Datei )
* mitliefern der DLL "fbclient.dll"
...fertsch.

Laß von der BDE die Finger! Muß man dich zu deinem Glück zwingen?



Fragen an dich (damit wir wissen welchen Kenntnisstand du hast):
* Unterschied Table und Query?
* was ist ein Index?
* was ist SQL?
* was ist SQL Injection? (für später)

Geändert von haentschman ( 5. Sep 2023 um 06:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.978 Beiträge
 
Delphi 12 Athens
 
#3

AW: Delphi 7 - BDE 32-Bit - Wie eine Datenbank und/oder Alias erstellen ?

  Alt 5. Sep 2023, 06:28
Es geht mir ja auch dadrum, eine Datenbank zu Haben, die von unbedarften Usern
installiert werden kann
Und deshalb möchtest du eine Datenbank haben, die ohne Adminrechte nicht installiert werden kann und unter neueren Betriebssystemen ohne manuelles Zutun der Nutzer nicht immer sauber läuft?

Statt einer Datenbank, die ohne Installation einfach so in deinem Anwendungsverzeichnis läuft? (Firebird Embedded)
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
984 Beiträge
 
Delphi 6 Professional
 
#4

AW: Delphi 7 - BDE 32-Bit - Wie eine Datenbank und/oder Alias erstellen ?

  Alt 5. Sep 2023, 09:31
Hmm..

oder (nicht bashen) mit den ADO-Komponenten von D7 eine (alte) ACCESS Datenbank per OLEDB.
Der alte OLEDB Treiber (Microsoft.Jet.OLEDB) für Access MDBs ist selbst bei Windos 11 noch per default installiert.

Somit kann aus dem Programm heraus eine MDB erzeigt werden und dann per SQL Tabellen...

Ergo:
- Keine Installation auf dem Client, die Anwendung kann als Portabel verwendet werden...
- Zwar besser nur SingleUse aber (eingeschränkt) auch von 2-3 Clients auf eine DB verwendbar..
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
356 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Delphi 7 - BDE 32-Bit - Wie eine Datenbank und/oder Alias erstellen ?

  Alt 5. Sep 2023, 10:42
@haentschman
Code:
Table = Ansammlung von (geordneten/strukturierten) Daten(sätzen),
         die per einzeln per Datensatz (Record) zur Verfügung stehen.
Query = Abfrage(sprache), mit denen Datensätze gesucht, gefiltert, geändert,
         werden können. Datensätze können aufgeteilt werden, so dass nicht die
         gesamten Daten (der Tabelle) in den Speicher des Client gehalten werden
         muss. Abfragen werden mit der Skript-Sprache SQL (Structured Query
         Language) eingeleitet/abgesetzt.
Index = Als primär-Index für das Suchen verwendet, um die Datenbanl-Anfrage(n)
         mittels SQL schneller, und eindeutig zu bestimmen.
         Bei Unter/Sub-Kategorien können dann auch sekundär-Indexe erstellt werden.
SQL   = Abfrage Skript-Sprache für Queries
Inject = Methoden, um SQL-Anfragen übers Netz zu manipulieren.
         Daher sollten alle Queries mit Parameter versehen werden.
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.438 Beiträge
 
Delphi 12 Athens
 
#6

AW: Delphi 7 - BDE 32-Bit - Wie eine Datenbank und/oder Alias erstellen ?

  Alt 5. Sep 2023, 10:50


Der Unterschied zwischen Table und Query ist:

Im Prinzip sind TTable und TQuery alle TDataSet. Sie halten Daten.
Der Unterschied ist: Die TTable holt IMMER ALLE Daten (select * from table). Die TQuery holt über SQL NUR die Daten die benötigt werden. (select yy from table where yy = z)
Je größer die Tabelle, wird die TTable länger geladen...Heißt, daß das Mittel der Wahl immer die TQuery sein soll.

Du mußt dich auch dringend mit den "Bausteinen" einer Datenbank beschäftigen. (SQL, Indizies etc.) Die sind wichtig. Dann wird es einfacher.

Fürs Erste mußt du dich für eine Datenbank entscheiden. BDE fällt aus. Imho Access mit ADO auch.

Tutorial SQL:
https://www.w3schools.com/sql/

Geändert von haentschman ( 5. Sep 2023 um 11:56 Uhr)
  Mit Zitat antworten Zitat
johndoe049

Registriert seit: 22. Okt 2006
175 Beiträge
 
#7

AW: Delphi 7 - BDE 32-Bit - Wie eine Datenbank und/oder Alias erstellen ?

  Alt 5. Sep 2023, 12:19
Zitat:
Hallo,
Danke Euch für Euer Feedback !
Ich habe mir aber mal erlaubt, doch mal bissl rumzubasteln und zu stöpseln ...
Es geht mir ja auch dadrum, eine Datenbank zu Haben, die von unbedarften Usern
installiert werden kann - Ihr wisst ja - GAUF - Größter Anzunehmender User Fehler...
Man braucht auch keine Admin Rechte, um die Registry zu wursteln, aber ich habe mal
im Code eine Abfrage eingetragen - sicher ist sicher ...
nur mal so, ein Snippet:
Hast du das auf dem PC mit Delphi 7 getestet oder auch auf einem PC ohne Delphi?

Du kannst bei der BDE nur dann sicher sein, dass es funktioniert, wenn du einen PC ohne Delphi zum testen verwendet. Alles andere ist sinnfrei, weil es falsche Ergebnisse bringt. Man meint, die BDE kann heute noch problemlos verwendet werden, ist aber nicht so.

Delphi selbst sorgt schon dafür, dass die BDE richtig funktioniert.

Übrigens ist Delphi 7 nicht tot. Das funktioniert auch auf Windows 10 und Windows 11. Ist bei sehr alten Projekten noch hilfreich.

Zitat:
Table = Ansammlung von (geordneten/strukturierten) Daten(sätzen),
die per einzeln per Datensatz (Record) zur Verfügung stehen.
Query = Abfrage(sprache), mit denen Datensätze gesucht, gefiltert, geändert,
werden können. Datensätze können aufgeteilt werden, so dass nicht die
gesamten Daten (der Tabelle) in den Speicher des Client gehalten werden
muss. Abfragen werden mit der Skript-Sprache SQL (Structured Query
Language) eingeleitet/abgesetzt.
Index = Als primär-Index für das Suchen verwendet, um die Datenbanl-Anfrage(n)
mittels SQL schneller, und eindeutig zu bestimmen.
Bei Unter/Sub-Kategorien können dann auch sekundär-Indexe erstellt werden.
SQL = Abfrage Skript-Sprache für Queries
Inject = Methoden, um SQL-Anfragen übers Netz zu manipulieren.
Daher sollten alle Queries mit Parameter versehen werden.

Es geht nicht darum, das aus einem Lexikon abzuschreiben. Wir wollen wissen, ob du dich mit SQL auskennst und entsprechende Select, Insert, Updates, etc. erstellen kannst. Bei BDE ist SQL nicht bei allen Datenmodellen notwendig. Bei den xBase kompatiblen Formaten konnte man das früher auch über modellinterne Techniken realiseren. Das ist aber eine veraltete Technik, mit der keine aktuelle Datenbank (OK, vielleicht Access) mehr arbeitet. Spätestens, wenn du beruflich programmiert und noch weitere Programmmierer involviert sind, muss man SQL können.

Wenn du mit veralteten Datenmodellen arbeiten willst, sei es dir gegönnt. Nur wir arbeiten im Heute und nicht in der Vergangenheit.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.978 Beiträge
 
Delphi 12 Athens
 
#8

AW: Delphi 7 - BDE 32-Bit - Wie eine Datenbank und/oder Alias erstellen ?

  Alt 5. Sep 2023, 13:41
Delphi selbst sorgt schon dafür, dass die BDE richtig funktioniert.
Delphi ändert da nichts. Allerdings verhält sich die BDE auf verschiedenen Rechnern höchst unterschiedlich. Das liegt unter anderem an der Ermittlung des gemeinsamen Speicherbereichs, da an der Stelle auf dem einen Rechner z.B. eine DLL geladen ist und auf dem anderen nicht. Das kann man sich sehr schön anschauen, wenn man mit FastMM die Speicherbelegung visualisiert.

Übrigens ist Delphi 7 nicht tot. Das funktioniert auch auf Windows 10 und Windows 11. Ist bei sehr alten Projekten noch hilfreich.
Es funktioniert noch, allerdings muss man diverse Fehler im Hinterkopf behalten und in den damit erstellten Programmen korrigieren (falsche Randberechnung, unsichtbare Buttons bei gedrückter Alt-Taste, Zeichenfehler mit DoubleBuffered, ...). Wenn man das tut, funktionieren damit erstellte Programme auch gut, aber es ist ein gewisser Aufwand nötig.

Die Installationsdateine für die BDE von Borland gibt es oft nur aus zweifelhaften Quellen.
Das stimmt nicht, selbst bei Delphi 11. Den BDE Installer für RAD Studio 11 gibt es z.B. in den Downloads für registrierte Benutzer. Darin enthalten ist die bdeinst.cab, auch sprachspezifisch. Die braucht man nur auspacken und die enthaltene DLL mit "regsvr32 bdeinst.dll" ausführen, dann wird die Installation gestartet.
Und bei Delphi 7 war der Installer ja auch dabei.

Sollte diese Datei einemal ohne Domain Administrator zu sein und ohne UAC ausgeführt werden und man ausversehen speichern (OK beim beenden des Programms), dann ist die Registry der BDE kaput und man muss die BDE deinstallieren, die Registry Einträge löschen und die BDE dann neu installieren.
Kaputt nicht gerade, aber selbst das Löschen der normalen Einträge hilft dann nicht weiter, denn das Problem ist ja die Virtualisierung älterer Programme. Man muss also die Daten löschen, die im Virtual Store für den einzelnen User gespeichert wurden, weil die eigentliche Stelle nur mit Adminrechten beschreibbar ist.

Die BDE/Paradox geht regelmäßig kaputt...dann muss man die Daten reorganisieren.
Nach einem Programm Absturz kann es sein, dass einige Tabellen weiterhin gelockt sind, dann muss man die P*.lck und P*.net löschen.
Nach einem Rechnerabsturz sind oft die Index Dateien kaputt -> Indexe neu aufbauen
Ja, dafür muss man entsprechende Tools entwickeln und bereitstellen, damit der User das überhaupt selbst machen kann. Trotzdem war das oft ein Fall für den Support, weil die eingebauten Reparaturmethoden es nicht automatisch korrigieren konnten und die Kunden es nicht selbst machen konnten.
Sebastian Jänicke
AppCentral

Geändert von jaenicke ( 5. Sep 2023 um 14:07 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
2.025 Beiträge
 
Delphi 12 Athens
 
#9

AW: Delphi 7 - BDE 32-Bit - Wie eine Datenbank und/oder Alias erstellen ?

  Alt 5. Sep 2023, 12:38
Nur um das mal ganz deutlich zu machen....
Die Installationsdateine für die BDE von Borland gibt es oft nur aus zweifelhaften Quellen.
Jeder User muss die haben.
Bei jeder Installation des Programms müssen die ausgeführt werden.
Mann sollte die nur als DER Domain Administrator ausführen.
Die BDE installiert die BDEAdmin.exe im IDAPI Verzeichniss.
Sollte diese Datei einemal ohne Domain Administrator zu sein und ohne UAC ausgeführt werden und man ausversehen speichern (OK beim beenden des Programms), dann ist die Registry der BDE kaput und man muss die BDE deinstallieren, die Registry Einträge löschen und die BDE dann neu installieren.

Die BDE/Paradox geht regelmäßig kaputt...dann muss man die Daten reorganisieren.
Nach einem Programm Absturz kann es sein, dass einige Tabellen weiterhin gelockt sind, dann muss man die P*.lck und P*.net löschen.
Nach einem Rechnerabsturz sind oft die Index Dateien kaputt -> Indexe neu aufbauen
Manchmal haben Tabellen abgespeicherte Keyviolations in der Datei auf dem Primary key und können nicht geöffnet werden.

USW USW USW

Wir haben die BDE noch Jahrelang am Leben gehalten, bei einigen Kunden bis heute! Das ist ein riesen Problem. Es ist mega aufwendig. Und die Menschen die sich mit diesem Dinosaurier auskennen werden auch weniger.
Ich will dich nicht bashen eher RETTEN. Dein Post fühlt sich so ein bisschen an wie wenn jemand um hilfe für seine Nitroglyzerinflaschen in seiner Silbermine fragt und alle sagen ihm: "Nimm doch bitte was anderes! TNT, Stickstoffdünger+Diesel, Plastik Sprengstoff, Nobel Dynamit...alles alles nur nicht das!"

Nochmals Entschuldigung.
Was soll ich sagen ? Bitte spring nicht?
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty ( 5. Sep 2023 um 12:41 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz