Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#24

AW: Automatiach erstellte Syntax

  Alt 7. Sep 2017, 16:58
Da mir vollkommen schleierhaft ist, wo denn genau der Fehler nun passiert, mal folgenden Vorschlag einer veränderten Prozedure:
Delphi-Quellcode:
function TDMLSQLite.ExecuteSQL(ASQL : String) : Boolean;
begin
  try
    FDSQLiteConnection.ExecSQL(ASQL);
    Result := True;
  except
    on E: EDatabaseError do begin
      ShowMessage('Fehler beim Ausführen des Statements:' + #13#13 + ASQL + #13#13 + + E.Message);
      Result := False;
    end;
  end;
end;

function TDMLSQLite.ConnectContentmasterDB : Boolean;
begin
  try
    FDSQLiteConnection.Connected := false;
    FDSQLiteConnection.Params.Values['Database'] := 'M:\SQLite-DB Corner\ContentmasterData\ContentmasterData.sqlite';
    FDSQLiteConnection.Params.Values['FailIfMissing'] := 'False';
    FDSQLiteConnection.Params.Values['PRAGMA foreign_keys'] := 'ON';
    FDSQLiteConnection.Connected := true;
    Result := FDSQLiteConnection.Connected;
  except
    on E: EDatabaseError do begin
      ShowMessage('Fehler beim Aufbau der Datenbankverbindung: ' + #13#13 + E.Message);
      Result := False;
    end;
  end;
end;

procedure TDMLSQLite.ContentmasterDBCreate;
begin
  if ConnectContentmasterDB then begin
    if ExecuteSQL(Createbilddescribetabelle) then
    if ExecuteSQL(Createbilddescribetabelle_has_HtmlTabell) then
    if ExecuteSQL(Createbildtabelle) then
    if ExecuteSQL(CreateCSSTabelle) then
    if ExecuteSQL(Creategalerietabelle) then
    if ExecuteSQL(CreateHTMLTable) then
    if ExecuteSQL(CreateJavascriptTable) then
    if ExecuteSQL(Createkategorien_tabelle) then
    if ExecuteSQL(Createkategorien_tabelle_has_bildDescribeTabelle) then
    if ExecuteSQL(CreateMenueTabelle) then
    if ExecuteSQL(CreateSubMenue2Table) then
    if ExecuteSQL(CreateSubmenuetabelle) then ShowMessage('Das war wohl nix!');
  end;
end;
Damit könnte dann erkennbar werden, ob der Fehler bereits bei der Herstellung der Datenbankverbindung auftritt oder erst im späteren Verlauf.
Wenn im späteren Verlauf, wird das fehlerverursachende Statement zusammen mit der Fehlermeldung ausgegeben.

Dies könnte ggfls. die Fehlerursachenforschung deutlich vereinfachen.

Und das ist nur ein Vorschlag, den man strukturell sicherlich noch deutlich verbessern könnte.

Eine noch bleibende Fehlerursache ist, dass bei FDSQLiteConnection.Params.Values davon ausgegangen wird, dass die Paramter schon vorhanden sind. Eventuell zusätzlich vorhandenen Parameter werden nicht geprüft und könnten ggfls. zu unerwünschten Nebenwirkungen führen.

Sinnvoll (und meiner Meinung nach zwingend) ist es, die Parameterliste nach dem Beenden der Verbindung zu leeren und dann die gewünschten Parameter in die Liste einzufügen.
TigerLilly hat da ja, durchaus berechtigt, schon drauf hingewiesen.

Dann schreibst Du einerseits
ATTACH "ContentMasterData.sdb" AS "ContentMasterData";
und andererseits

DMLSQLite.FDSQLiteConnection.Params.Values['Database']:='M:\SQLite-DB Corner\ContentmasterData\ContentmasterData.sqlite';
Wo wird der Zusammenhang zwischen ContentMasterData.sdb und ContentmasterData.sqlite hergestellt?
Das ist mir nicht klar, könnte das gglfs. eine Fehlerursache sein?

Zumindest hätte ich da eher sowas erwartet:

ATTACH "ContentMasterData.sqlite" AS "ContentMasterData";
Aber da mag ich mich wohl auch irren.

Geändert von nahpets ( 7. Sep 2017 um 17:02 Uhr) Grund: Schreibfehler behoben, sehe ich immer zu spät :-(
  Mit Zitat antworten Zitat