AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Interbase SQL-Dialect 1/3 - Problem
Thema durchsuchen
Ansicht
Themen-Optionen

Interbase SQL-Dialect 1/3 - Problem

Ein Thema von wendelin · begonnen am 18. Dez 2013 · letzter Beitrag vom 18. Dez 2013
Antwort Antwort
Seite 1 von 2  1 2      
wendelin

Registriert seit: 29. Dez 2010
Ort: Nürnberg
126 Beiträge
 
Delphi 7 Enterprise
 
#1

Interbase SQL-Dialect 1/3 - Problem

  Alt 18. Dez 2013, 01:22
Datenbank: Interbase • Version: 6 • Zugriff über: SQL
Hallo,
Ich lege eine neue Datenbank nicht mit der IBConsole oder mit Script's sondern ausschliesslich aus Delphi heraus an. Ebenso ALLE Tabellen.

Siehe Quellcode:
Delphi-Quellcode:

(*  DataBase + Tables anlegen DataBase + Tables anlegen *)
          (*  TEIL1 --- TEIL1 --- TEIL1  *)
(******************************************************************************)
 procedure TForm3.SpeedButton9Click(Sender: TObject);
(******************************************************************************)
VAR DBPath : STRING;
const
  cCreateTxt = ' %d. Versuch: Datenbank wird erstellt...';
  cReadyTxt = 'Datenbank wurde erstellt!';
begin
  If not FileExists(g_DBPfad + '\My_IB_DB.gdb') then
  begin
    DBPath := g_DBPfad + '\My_IB_DB.gdb';
    EditDBPath.Text := DBPath;
    EditDBPath.Refresh;
    Screen.Cursor := crHourGlass;
    If DataModule2.IBD.LoginPrompt = TRUE THEN DataModule2.IBD.LoginPrompt := FALSE;
    IF DataModule2.IBD.Connected = TRUE THEN DataModule2.IBD.Connected := FALSE;
    DataModule2.IBD.Params.Clear;
    try
      try
        StatusBar.SimpleText := Format(cCreateTxt, [1]);
        StatusBar.Refresh;
        with DataModule2.IBD do
        begin
          DatabaseName := EditDBPath.Text;
          Params.Add(Format('USER "%s"', [EditUserName.Text]));
          Params.Add(Format('PASSWORD "%s"', [EditPassword.Text]));
   --> SQLDialect:=1; // (3 ?)geht nicht mit
          Params.Add('PAGE_SIZE 4096'); // SQLDialect'3'-->
          Params.Add('DEFAULT CHARACTER SET ISO8859_1'); // wahrscheinlich wegen
          CreateDatabase; // Double-Quotes o.ä!!
        end;
        StatusBar.SimpleText := cReadyTxt;
        Tables_anlegen; // Tabellen werden angelegt
        SpeedButton9.Enabled := False;
        except
        on E:EDatabaseError do
        begin
          MessageBeep(MB_ICONEXCLAMATION);
          MessageDlg(E.Message, mtError, [mbOk], 0);
        end;
      end;
      finally
      Screen.Cursor := crDefault;
    end;
  end ELSE ShowMessage(' Die Datenbank existiert schon !');
end;
Meine Frage : Warum funktioniert nur die Anlage der IBDB im SQL-Dialect 1, aber nicht in Dialect 3?
In (Tedit)[EditUserName.Text] steht SYSDBA; in (Tedit)[EditPassword.Text] masterkey (Property PasswordChar '*********'. Auch wenn ich die Zeile (mit Pfeil) komplett heraus nehme und im Object-Inspector SQL-Dialect auf '3' setzte kommt die RunTime-Fehlermeldung : token unknown line 1 char 94
"SYSDBA".

-----------------------------------------------------------------------------------------------

Ferner habe ich noch eine allgemeine Frage: Wie kann ich meine Beiträge (Fragen) als "Erledigt"
kennzeichnen ?
Wolfgang
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#2

AW: Interbase SQL-Dialect 1/3 - Problem

  Alt 18. Dez 2013, 02:49
Warum wird das so gemacht :

...nicht mit der IBConsole oder mit Script's sondern ausschliesslich aus Delphi heraus an. Ebenso ALLE Tabellen.
Wenn dann nämlich so eine Fehlermeldung kommt :

Code:
token unknown line 1 char 94
"SYSDBA".
Wo ist nun die Zeile 94 ? Die gilt für die DB, nicht für Dein Programm! Welches SQL-Script wird denn nun erzeugt ? Sieht für mich so aus, dass da in erster Zeile "USER" steht. Am Anfang dürften aber nur SETs usw. da stehen und dann kommt irgendwann "create". In Delphi allerdings schwer nachzuvollziehen.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Interbase SQL-Dialect 1/3 - Problem

  Alt 18. Dez 2013, 02:54
Ein paar Anmerkungen zu deinem Code
  • Das hier
    Delphi-Quellcode:
        If DataModule2.IBD.LoginPrompt = TRUE THEN DataModule2.IBD.LoginPrompt := FALSE;
        IF DataModule2.IBD.Connected = TRUE THEN DataModule2.IBD.Connected := FALSE;
    kannst du auch so schreiben
    Delphi-Quellcode:
        DataModule2.IBD.LoginPrompt := FALSE;
        DataModule2.IBD.Connected := FALSE;
  • das hier
    Delphi-Quellcode:
    Screen.Cursor := ...;
    Foo; // Hier kommt eine Exception und der Cursor wird nicht zurückgesetzt!
    try
      Bar;
    finally
      Screen.Cursor := ...;
    end;
    eher so
    Delphi-Quellcode:
    Screen.Cursor := ...;
    try
      Foo; // kann kommen was will, der Cursor wird zurückgesetzt
      Bar;
    finally
      Screen.Cursor := ...;
    end;
  • und hier
    Delphi-Quellcode:
    try
      Foo;
      Bar;
    except
      on E:EDatabaseError do
        begin
          MessageBeep(MB_ICONEXCLAMATION);
          MessageDlg(E.Message, mtError, [mbOk], 0);
        end;
    end;
    machst du das Gleiche, was bei einer normalen (ungefangenen) Exception auch passiert.
    Es wird eine Messagebox mit dem Fehler angezeigt. Allerdings wird bei dir der Code nach except ... end; noch weiter ausgeführt.

    Es passiert hier nur deswegen nichts, weil danach nur noch Zeilen kommen, die auch bei einer Exception ausgeführt werden.

    So behandelt man Exceptions nicht.

    kannst du also auch so vereinfachen (verbessern)
    Delphi-Quellcode:
    Foo;
    Bar;
Zum eigentlichen Thema:

Wenn du uns das Script zeigst, dann können wir evtl. auch die Frage beantworten.

Offene Fragen schließen:

Schreibe eine Antwort und entferne unten den Haken bei "Dieses Thema als offene Frage markieren"
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (18. Dez 2013 um 02:59 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Interbase SQL-Dialect 1/3 - Problem

  Alt 18. Dez 2013, 07:44
Zitat:
Code:
token unknown line 1 char 94
"SYSDBA".
Wo ist nun die Zeile 94 ?
Hier sthet nichts von Zeile 94 sondern Zeile 1 Zeichen 94
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
672 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Interbase SQL-Dialect 1/3 - Problem

  Alt 18. Dez 2013, 09:47
weil im Dialekt 1 die Nutzung von " und ' gleichwertig ist und im Dialekt 3 " für Objektnamen und ' für Strings benutzt wird. Der Username Sysdba ist ein String und muß daher mit ' abgegrenzt werden. Das wäre aber weiterhin auch zum Dialekt 1 kompatibel
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Interbase SQL-Dialect 1/3 - Problem

  Alt 18. Dez 2013, 10:29
Wenn du das etwas umstrukturierst, dann wird das auch übersichtlicher und besser dokumentiert:

In TForm3 folgendes rein:
Delphi-Quellcode:
  // Wir wollen etwas in die StatusBar schreiben
  procedure TForm3.SetStatus( const AText : string );
    begin
      StatusBar.SimpleText := AText;
      StatusBar.Refresh;
    end;

  procedure TForm3.SpeedButton9Click( Sender : TObject );
    begin
      EditDBPath.Text := g_DBPfad + '\My_IB_DB.gdb';
      // Das DataModule kümmert sich um die Anlage der Datenbank
      // Um StatusMeldungen an die Form zu liefern, nehmen wir die Methode SetStatus als Callback ;o)
      DataModule2.CreateDataBase( EditDBPath.Text, EditUserName.Text, EditPassword.Text, SetStatus );
    end;
In TDataModule2 werden die Methoden CreateDatabase und CreateTables angelegt
Delphi-Quellcode:
  // Eine Callback-Methode für Status-Meldungen
  type
    TStatusCallback = procedure( const AStatus : string ) of object;

  procedure TDataModule2.CreateTables( StatusCallback : TStatusCallback );
    begin
      // whatever
    end;

  procedure TDataModule2.CreateDataBase( const DBPath, Username, Password : string; StatusCallback : TStatusCallback );
    const
      cCreateTxt = ' %d. Versuch: Datenbank wird erstellt...';
      cReadyTxt = 'Datenbank wurde erstellt!';
      cFailureText = 'Datenbank konnte nicht erstellt werden!';
    begin
      if FileExists( DBPath )
      then
        // Keine Meldung ausgeben, sondern eine Exception
        // Dadurch kommt die Meldung eh ;o)
        raise Exception.CreateFmt( 'Die Datenbank "%s" existiert schon', DBPath );

      Screen.Cursor := crHourGlass;
      try
        IBD.LoginPrompt := FALSE;
        IBD.Connected := FALSE;
        IBD.Params.Clear;

        // StatusMeldung (Callback-Methode aufrufen)
        StatusCallback( Format( cCreateTxt, [1] ) );

        try

          IBD.DatabaseName := DBPath;
          IBD.Params.Add( Format( 'USER "%s"', [Username] ) );
          IBD.Params.Add( Format( 'PASSWORD "%s"', [Password] ) );
          IBD.SQLDialect := 1;
          IBD.Params.Add( 'PAGE_SIZE 4096' );
          IBD.Params.Add( 'DEFAULT CHARACTER SET ISO8859_1' );
          IBD.CreateDataBase;

          // StatusMeldung (Callback-Methode aufrufen)
          StatusCallback( cReadyTxt );

          // Tables_anlegen; // Tabellen werden angelegt
          CreateTables( StatusCallback );

        except
          on E : Exception do
            begin
              if FileExists( DBPath )
              then
                DeleteFile( DBPath );

              // StatusMeldung (Callback-Methode aufrufen)
              StatusCallback( cFailureText );

              raise;
            end;
        end;

      finally
        Screen.Cursor := crDefault;
      end;
    end;
Und damit ist in TForm3.SpeedButton9Click auf einen Blick klar, was da passiert -> Es wird eine Datenbank angelegt (Documentation by Code). Vorher musste man sich erst durch den Quellcode wühlen, um das festzustellen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (18. Dez 2013 um 10:37 Uhr)
  Mit Zitat antworten Zitat
wendelin

Registriert seit: 29. Dez 2010
Ort: Nürnberg
126 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: Interbase SQL-Dialect 1/3 - Problem

  Alt 18. Dez 2013, 10:58
weil im Dialekt 1 die Nutzung von " und ' gleichwertig ist und im Dialekt 3 " für Objektnamen und ' für Strings benutzt wird. Der Username Sysdba ist ein String und muß daher mit ' abgegrenzt werden. Das wäre aber weiterhin auch zum Dialekt 1 kompatibel
Danke für Deine Antwort. Aber: wenn ich in Edit anstatt SYSDBA --> 'SYSDBA' eingebe meckert der
Compiler ->> funktioniert also auch nicht ( your UserName and Password are not defined)!
NaJa was solls, Dialect 1 funktioniert ja.
Wolfgang
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#8

AW: Interbase SQL-Dialect 1/3 - Problem

  Alt 18. Dez 2013, 11:05
Params.Add(Format('USER %s', [QuotedStr(EditUserName.Text)])); oder auch
Params.Add(Format('USER ''%s''', [EditUserName.Text])); , dann meckert der Compiler nicht mehr, und Du hast Deine Hochkommata.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
wendelin

Registriert seit: 29. Dez 2010
Ort: Nürnberg
126 Beiträge
 
Delphi 7 Enterprise
 
#9

AW: Interbase SQL-Dialect 1/3 - Problem

  Alt 18. Dez 2013, 11:07
Wenn du das etwas umstrukturierst, dann wird das auch übersichtlicher und besser dokumentiert:

In TForm3 folgendes rein:
Delphi-Quellcode:
  // Wir wollen etwas in die StatusBar schreiben
  procedure TForm3.SetStatus( const AText : string );
    begin
      StatusBar.SimpleText := AText;
      StatusBar.Refresh;
    end;

  procedure TForm3.SpeedButton9Click( Sender : TObject );
    begin
      EditDBPath.Text := g_DBPfad + '\My_IB_DB.gdb';
      // Das DataModule kümmert sich um die Anlage der Datenbank
      // Um StatusMeldungen an die Form zu liefern, nehmen wir die Methode SetStatus als Callback ;o)
      DataModule2.CreateDataBase( EditDBPath.Text, EditUserName.Text, EditPassword.Text, SetStatus );
    end;
In TDataModule2 werden die Methoden CreateDatabase und CreateTables angelegt
Delphi-Quellcode:
  // Eine Callback-Methode für Status-Meldungen
  type
    TStatusCallback = procedure( const AStatus : string ) of object;

  procedure TDataModule2.CreateTables( StatusCallback : TStatusCallback );
    begin
      // whatever
    end;

  procedure TDataModule2.CreateDataBase( const DBPath, Username, Password : string; StatusCallback : TStatusCallback );
    const
      cCreateTxt = ' %d. Versuch: Datenbank wird erstellt...';
      cReadyTxt = 'Datenbank wurde erstellt!';
      cFailureText = 'Datenbank konnte nicht erstellt werden!';
    begin
      if FileExists( DBPath )
      then
        // Keine Meldung ausgeben, sondern eine Exception
        // Dadurch kommt die Meldung eh ;o)
        raise Exception.CreateFmt( 'Die Datenbank "%s" existiert schon', DBPath );

      Screen.Cursor := crHourGlass;
      try
        IBD.LoginPrompt := FALSE;
        IBD.Connected := FALSE;
        IBD.Params.Clear;

        // StatusMeldung (Callback-Methode aufrufen)
        StatusCallback( Format( cCreateTxt, [1] ) );

        try

          IBD.DatabaseName := DBPath;
          IBD.Params.Add( Format( 'USER "%s"', [Username] ) );
          IBD.Params.Add( Format( 'PASSWORD "%s"', [Password] ) );
          IBD.SQLDialect := 1;
          IBD.Params.Add( 'PAGE_SIZE 4096' );
          IBD.Params.Add( 'DEFAULT CHARACTER SET ISO8859_1' );
          IBD.CreateDataBase;

          // StatusMeldung (Callback-Methode aufrufen)
          StatusCallback( cReadyTxt );

          // Tables_anlegen; // Tabellen werden angelegt
          CreateTables( StatusCallback );

        except
          on E : Exception do
            begin
              if FileExists( DBPath )
              then
                DeleteFile( DBPath );

              // StatusMeldung (Callback-Methode aufrufen)
              StatusCallback( cFailureText );

              raise;
            end;
        end;

      finally
        Screen.Cursor := crDefault;
      end;
    end;
Und damit ist in TForm3.SpeedButton9Click auf einen Blick klar, was da passiert -> Es wird eine Datenbank angelegt (Documentation by Code). Vorher musste man sich erst durch den Quellcode wühlen, um das festzustellen.
Lieber Sir Rufo, der SourceCode stammt fast 1:1 von Andreas Kosch (Datenbankentwicklung mit Interbase - S.338-339). Bisher hatte ich an dem Buch wenig auszusetzten.
Dennoch vielen Dank für Deine Anregungen.
Meine eigentliche Frage ist aber immer noch nicht beantwortet worden !
Wolfgang
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Interbase SQL-Dialect 1/3 - Problem

  Alt 18. Dez 2013, 11:36
@wendelin

Du hast auch immer noch nicht das Skript gezeigt, was da ausgeführt werden soll.
Wie sollen wir das also beantworten können?

Vorbeikommen und auf deinen Bildschirm schauen?

Hoffentlich hast du genug zu trinken da
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz