Announcement

Collapse
No announcement yet.

Create Database im Programm ausführen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Create Database im Programm ausführen

    Hi, ich wollte einige Datenbanken innerhalb des Programmes erstellen lassen. Doch nach dem Auf ruf von create database 'c:\test.gdb' user='test' password='test' page_size=4096 bekomme ich immer die Fehlermeldung : Hauptdatensatz nicht gefunden, Cannot prepare a CREATE DATABASE/SCHEMA statement.
    Hat jemand ne Ahnung, was ich da falsch mache?

  • #2
    Hallo,

    hinter dieser Fehlermeldung steckt das typischen "Henne/Ei"-Problem. Das Programm versucht, die CREATE DATABASE-Anweisung über den Aufruf von Prepare vorzubreiten, aber dafür wird eine bestehende Verbindung zur Datenbank benötigt. Um dieses Problem zu lösen, muss man dafür sorgen, dass auf das implizit dazwischengeschaltete Prepare verzichtet wird. Dafür gibt es verschiedene Lösungsmöglichkeiten:

    A) InterBase-API-Funktion <b>isc_dsql_execute_immediate</b>
    <pre>
    procedure CreateDatabase(DBName, User, Pswd: String);
    var
    status : Array[1..19] of Longint;
    db, tran : PLongint;
    rslt : Longint;
    BaseSQL : String;
    begin
    // Handles müssen für CREATE DATABASE nil sein
    db := nil;
    tran := nil;
    BaseSQL := 'CREATE DATABASE "' + DBName +
    '" USER "' + User +
    '" PASSWORD ' + '"' + Pswd + '" ' +
    'DEFAULT CHARACTER SET ISO8859_1';
    // InterBase-API-Funktion aufrufen
    rslt := isc_dsql_execute_immediate(@status, db, tran, 0,
    PChar(BaseSQL), 1, nil);
    if rslt <> 0 then
    raise EDatabaseError.Create(
    'Fehler beim Erstellen der Datenbank!' +
    #10#13 + 'ISC-Nr.: ' + IntToStr(rslt) +
    #10#13 + FormulateError(rslt, @status));
    // Verbindung zur neu erstellen Datenbank abbauen
    rslt := isc_detach_database(@status, db);
    if rslt <> 0 then
    raise EDatabaseError.Create(
    'Fehler beim Trennen der Verbindung!' +
    #10#13 + 'ISC-Nr.: ' + IntToStr(rslt) +
    #10#13 + FormulateError(rslt, @status));
    end;
    </pre>
    B) TIBDatabase-Methode <b>CreateDatabase</b>
    <pre>
    procedure TMainForm.BtnCreateDBClick(Sender: TObject);
    const
    cCreateTxt = ' %d. Versuch: Datenbank wird erstellt...';
    cReadyTxt = 'Datenbank wurde erstellt!';
    begin
    Screen.Cursor := crHourGlass;
    try
    try
    StatBar.SimpleText := Format(cCreateTxt, [1]);
    Refresh;
    with IBDatabase1 do
    begin
    DatabaseName := EditDBPath.Text;
    Params.Add(Format('USER "%s"', [EditUserName.Text]));
    Params.Add(Format('PASSWORD "%s"', [EditPassword.Text]));
    Params.Add('PAGE_SIZE 4096');
    Params.Add('DEFAULT CHARACTER SET ISO8859_1');
    CreateDatabase;
    end;
    StatBar.SimpleText := cReadyTxt;
    BtnCreateTable.Enabled := True;
    BtnCreateDB.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;
    </pre&gt

    Comment

    Working...
    X