![]() |
Datenbank: Interbase • Version: 6 • Zugriff über: SQL
Interbase SQL-Dialect 1/3 - Problem
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:
Meine Frage : Warum funktioniert nur die Anlage der IBDB im SQL-Dialect 1, aber nicht in Dialect 3?(* 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; 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 ? :freak: |
AW: Interbase SQL-Dialect 1/3 - Problem
Warum wird das so gemacht :
Zitat:
Code:
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. 8-)
token unknown line 1 char 94
"SYSDBA". |
AW: Interbase SQL-Dialect 1/3 - Problem
Ein paar Anmerkungen zu deinem Code
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" |
AW: Interbase SQL-Dialect 1/3 - Problem
Zitat:
|
AW: Interbase SQL-Dialect 1/3 - Problem
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
|
AW: Interbase SQL-Dialect 1/3 - Problem
Wenn du das etwas umstrukturierst, dann wird das auch übersichtlicher und besser dokumentiert:
In
Delphi-Quellcode:
folgendes rein:
TForm3
Delphi-Quellcode:
In
// 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;
Delphi-Quellcode:
werden die Methoden
TDataModule2
Delphi-Quellcode:
und
CreateDatabase
Delphi-Quellcode:
angelegt
CreateTables
Delphi-Quellcode:
Und damit ist in
// 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;
Delphi-Quellcode:
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.
TForm3.SpeedButton9Click
|
AW: Interbase SQL-Dialect 1/3 - Problem
Zitat:
Compiler ->> funktioniert also auch nicht ( your UserName and Password are not defined)! NaJa was solls, Dialect 1 funktioniert ja. |
AW: Interbase SQL-Dialect 1/3 - Problem
Delphi-Quellcode:
oder auch
Params.Add(Format('USER %s', [QuotedStr(EditUserName.Text)]));
Delphi-Quellcode:
, dann meckert der Compiler nicht mehr, und Du hast Deine Hochkommata.
Params.Add(Format('USER ''%s''', [EditUserName.Text]));
|
AW: Interbase SQL-Dialect 1/3 - Problem
Zitat:
Dennoch vielen Dank für Deine Anregungen. Meine eigentliche Frage ist aber immer noch nicht beantwortet worden ! |
AW: Interbase SQL-Dialect 1/3 - Problem
@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 :cheers: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:49 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