[Gelöst] sqSupportEmptyDatabaseName wird ignoriert...

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

[Gelöst] sqSupportEmptyDatabaseName wird ignoriert...

Beitrag von pluto »

Hallo

Mein Ziel ist es eine Klasse zu erstellen, die eine Datenbank mit ihren Tabellen komplett anlegen kann.
Problem dabei ist nur, dass ich irgendein Fehler mache und ich weiß nicht warum.

Es kommt folgende Fehlermeldung:
Failed to select database: No database selected


Ist auch klar, ich habe auch keine DB ausgewählt, sondern möchte eine NEUE erstellen, die ich dann auswählen möchte.

Bei meiner Suche im Code von mySQl bin ich auf sqSupportEmptyDatabaseName gestoßen. Die ist aber nur ReadOnly was ich schade finde. Darum habe ich eine neue Klasse von TMySQL57Connection abgeleitet und dort im Create:

Code: Alles auswählen

  FConnOptions:=FConnOptions+[sqSupportEmptyDatabaseName];
geschrieben.
Der Fehler kommt aber weiterhin. In der Fehlermeldung wird sogar meine eigene Klasse genannt.

Code: Alles auswählen

 
procedure TPLForumV1.CreateDB;
var
  str:string;
begin
  writeln(sqSupportEmptyDatabaseName in MariaDB.AConnection.ConnOptions );
  MariaDB.AConnection.DatabaseName:='';
 
{  MariaDB.AConnection.Open;
  str:='CREATE DATABASE IF NOT EXISTS '+DBName;
  MariaDB.AConnection.ExecuteDirect(str);
  writeln('TEST01');}

 
//  MariaDB.Query.SQL.Text:=str;
//  MariaDB.Query.ExecSQL;
//  MariaDB.ATransaction.Commit;
 
  //MariaDB.AConnection.DatabaseName:=DBName;
//  MariaDB.Query.SQL.Text:='USE ' + DBName;
//  MariaDB.Query.ExecSQL;
 
 
//  MariaDB.AConnection.DatabaseName:=DBName;
 
  str:='SHOW DATABASES LIKE '''+DBName+''';';
 
  MariaDB.Query.SQL.Text:=str;
  MariaDB.Query.ExecSQL;
  MariaDB.Query.Open;
 

Hier ist ein Code Ausschnitt. Sobald ich ExecSQL mache, kommt der Fehler. Dabei möchte ich hier nur Feststellen, ob es die Datanbank schon gibt.
Belege ich DatabaseName mit einer vorhanden DB geht es, aber dann wird komischerweise nur dort die Tabellen hinzugefügt und nicht in der "neuen" db die aber angelegt wird.

Kann mir jemand sagen, was ich Falsch mache? ich nutzte eine MariaDB(TMySQL57Connection). Das ganze soll später eine Konsolen Anwendung werden und in einem WebServer oder WebSocketServer laufen.
Zuletzt geändert von pluto am Mi 28. Jun 2017, 22:44, insgesamt 1-mal geändert.
MFG
Michael Springwald

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: sqSupportEmptyDatabaseName wird ignoriert...

Beitrag von af0815 »

Nim keine Query, sondern setze dein Create DB direkt auf der Connection ab.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: sqSupportEmptyDatabaseName wird ignoriert...

Beitrag von pluto »

Danke für deine Antwort.

Dieser Code scheint ganz gut zu Funktionieren.

Code: Alles auswählen

 
procedure TPLForumV1.CreateDB;
var
  str:string;
begin
  MariaDB.AConnection.DatabaseName:='';
 
  MariaDB.AConnection.Open;
  str:='CREATE DATABASE IF NOT EXISTS '+DBName;
  MariaDB.AConnection.ExecuteDirect(str);
  MariaDB.AConnection.Close(); // Sonst wird die DB nicht ausgewählt
  MariaDB.AConnection.DatabaseName:=DBName; // Name der DB Setzten
  MariaDB.ATransaction.Active:=true; // Verbindung aktivieren.
 
  str:='SHOW DATABASES LIKE '''+DBName+''';';
  MariaDB.Query.SQL.Text:=str;
  MariaDB.Query.ExecSQL;
  MariaDB.Query.Open;
 
  writeln(MariaDB.Query.RecordCount);
  if MariaDB.Query.RecordCount = 1 then begin // Datanbank erstellen
//  Das hier natürlich nicht
//    MariaDB.Query.SQL.Text:='CREATE DATABASE IF NOT EXISTS '+DBName+';';
//    MariaDB.Query.ExecSQL;
//    MariaDB.ATransaction.Commit;
 
    MariaDB.Query.SQL.Text:='grant all on '+DBName+'.* to plutodb@localhost;';
    MariaDB.Query.ExecSQL;
    MariaDB.ATransaction.Commit;
    MessageTable.CreateTable();
    PostTable.CreateTable();
  end;
 
 
end; // TPLForumV1.CreateDB \0
 

Ich weiß zwar nicht ob alles so richtig ist, aber laut der mysql Console scheint dies der Fall zu sein.
MFG
Michael Springwald

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: sqSupportEmptyDatabaseName wird ignoriert...

Beitrag von Socke »

Anstatt die Verbindung neu aufzubauen

Code: Alles auswählen

  MariaDB.AConnection.Close(); // Sonst wird die DB nicht ausgewählt
  MariaDB.AConnection.DatabaseName:=DBName; // Name der DB Setzten
  MariaDB.ATransaction.Active:=true; // Verbindung aktivieren. 

kannst du auch die aktive Datenbank per SQL wechseln:

Code: Alles auswählen

MariaDB.AConnection.ExecuteDirect('USE '+DBName);

ggf. musst du danach noch die MariaDB.AConnection.DatabaseName für die anderen Komponenten (Query) aktualisieren, aber zumindest weiß MariaDB jetzt, auf welche Datenbank du arbeitest.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: [Gelöst] sqSupportEmptyDatabaseName wird ignoriert...

Beitrag von pluto »

Danke für den Tipp, werde ich mal ausprobieren.
Jedoch wird der Code hier nur Einmal ausgeführt beim Starten.
MFG
Michael Springwald

Antworten