Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MySQL Daten Bank Editor (https://www.delphipraxis.net/133148-mysql-daten-bank-editor.html)

Natura 26. Apr 2009 21:44

Datenbank: MySQL • Version: 5.0.51b • Zugriff über: eigene php DB editor script

MySQL Daten Bank Editor
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi ich will einen Datenbank editor erstellen habe es auch fast geschaft und weiter weiß ich leider nicht mehr.

Bin noch Änfänger sprich lerne es erst seit 1 Jahr

// Mann kann sich einloggen
// Mann Findet alle informationen bzw alle sql einträge

so jetzt zu meinem Problem ich will damit auch die Datenbank bearbeiten können.

Was mir noch fehlt und wo ich hilfe brauche :

// Edior Feld für beide Tabellen
// Logout Button
// Ein Button um eine tabelle zu einzufügen

Wär für hilfe sehr dankbar

Der Quellcode

Delphi-Quellcode:
unit dbeditor;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls, ExtCtrls, mysql, sEdit, sButton, sSkinManager,
  sLabel;

type
  TForm1 = class(TForm)
    Bevel1: TBevel;
    DatabaseListBox: TListBox;
    TableListBox: TListBox;
    TableStringGrid: TStringGrid;
    FieldListGrid: TStringGrid;
    sSkinManager1: TsSkinManager;
    LoginButton: TsButton;
    PasswordEdit: TsEdit;
    UserEdit: TsEdit;
    HostEdit: TsEdit;
    sLabelFX1: TsLabelFX;
    sLabelFX2: TsLabelFX;
    sLabelFX3: TsLabelFX;
    sLabelFX4: TsLabelFX;
    sLabelFX5: TsLabelFX;
    sLabelFX7: TsLabelFX;
    sLabelFX8: TsLabelFX;
    sLabelFX9: TsLabelFX;
    sLabelFX10: TsLabelFX;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure DatabaseListBoxClick(Sender: TObject);
    procedure TableListBoxClick(Sender: TObject);
    procedure LoginButtonClick(Sender: TObject);
  private
    LibHandle: PMYSQL;
    ConHandle: PMYSQL;
    function DoQuote(const s: String): String;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure ClearGrid(Grid: TStringGrid);
var
  row, col: Integer;
begin
  for row := 1 to Grid.RowCount - 1 do
    for col := 0 to Grid.ColCount - 1 do
      Grid.Cells[col, row] := '';
end;

procedure TForm1.DatabaseListBoxClick(Sender: TObject);
var
  MyResult: Integer;
  mySQL_Res: PMYSQL_RES;
  MYSQL_ROW: PMYSQL_ROW;
begin
  TableListBox.Items.Clear;
  ClearGrid(FieldListGrid);
  TableListBox.Enabled := False;
  with DatabaseListBox do
    MyResult := mysql_select_db(ConHandle, PAnsiChar(Items[ItemIndex]));
  if MyResult<>0
  then
    raise Exception.Create(mysql_error(ConHandle));

  mySQL_Res := mysql_list_tables(ConHandle, nil);
  if mySQL_Res=nil
  then
    raise Exception.Create(mysql_error(ConHandle));
  try
    repeat
      MYSQL_ROW := mysql_fetch_row(mySQL_Res);
      if MYSQL_ROW<>nil
      then begin
        TableListBox.Items.Add(MYSQL_ROW^[0]);
      end;
    until MYSQL_ROW=nil;
  finally
    mysql_free_result(mySQL_Res);
  end;
  if TableListBox.Items.Count>0
  then begin
    TableListBox.Enabled := True;
  end;
end;

function TForm1.DoQuote(const s: String): String;
begin
  SetLength(Result, Length(s)*2+1);
  SetLength(Result, mysql_real_escape_string(ConHandle,
                                             Pointer(Result),
                                             PChar(s),
                                             Length(s)));
  Result := '`' + Result + '`';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  libmysql_fast_load(nil);
  LibHandle := mysql_init(nil);
  FieldListGrid.Cells[0, 0] := 'Name';
  FieldListGrid.Cells[1, 0] := 'Type';
  FieldListGrid.Cells[2, 0] := 'Len';
  FieldListGrid.Cells[3, 0] := 'Flags';
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  mysql_close(LibHandle);
  libmysql_free;
end;

procedure TForm1.LoginButtonClick(Sender: TObject);
var
  mySQL_Res: PMYSQL_RES;
  MYSQL_ROW: PMYSQL_ROW;
begin
  DatabaseListBox.Items.Clear;
  DatabaseListBox.Enabled := False;
  ConHandle := mysql_real_connect(LibHandle,
                                  PAnsiChar(HostEdit.Text),
                                  PAnsiChar(UserEdit.Text),
                                  PAnsiChar(PasswordEdit.Text),
                                  nil, 0, nil, 0);
  if ConHandle=nil
  then
    raise Exception.Create(mysql_error(LibHandle));
  Caption := HostEdit.Text + ' ' + mysql_get_server_info(ConHandle);

  mySQL_Res := mysql_list_dbs(ConHandle, nil);
  if mySQL_Res=nil
  then
    raise Exception.Create(mysql_error(ConHandle));
  try
    repeat
      MYSQL_ROW := mysql_fetch_row(mySQL_Res);
      if MYSQL_ROW<>nil
      then begin
        DatabaseListBox.Items.Add(MYSQL_ROW^[0]);
      end;
    until MYSQL_ROW=nil;
  finally
    mysql_free_result(mySQL_Res);
  end;
  if DatabaseListBox.Items.Count>0
  then begin
    LoginButton.Enabled := False;
    DatabaseListBox.Enabled := True;
  end;
end;

function GetFieldTypeString(mySQL_Field: PMYSQL_FIELD): String;
const
  FieldtypeString1: array [MYSQL_TYPE_DECIMAL..MYSQL_TYPE_BIT] of String=(
   'NUMERIC', 'TINYINT', 'SMALLINT', 'INTEGER',
   'FLOAT', 'DOUBLE', 'T_NULL', 'TIMESTAMP',
   'BIGINT', 'MEDIUMINT', 'DATE', 'TIME',
   'DATETIME', 'YEAR', 'NEWDATE', 'VARCHAR',
   'BIT');
  FieldtypeString2: array [MYSQL_TYPE_NEWDECIMAL..MYSQL_TYPE_GEOMETRY] of String=(
    'NEWDECIMAL', 'ENUM', 'SET',
    'TINY_BLOB', 'MEDIUM_BLOB', 'LONG_BLOB', 'BLOB',
    'VAR_STRING', 'STRING', 'GEOMETRY');
begin
  if mysql_field_type(mySQL_Field) in [MYSQL_TYPE_DECIMAL..MYSQL_TYPE_BIT]
  then
    Result := FieldtypeString1[mysql_field_type(mySQL_Field)]
  else
  if mysql_field_type(mySQL_Field) in [MYSQL_TYPE_NEWDECIMAL..MYSQL_TYPE_GEOMETRY]
  then
    Result := FieldtypeString2[mysql_field_type(mySQL_Field)]
  else
    Result := 'unknown';
end;

function GetFieldFlagString(mySQL_Field: PMYSQL_FIELD): String;
begin
  Result := '';
  if IS_NUM_FIELD(mySQL_Field)
  then begin
    if (mysql_field_flag(mySQL_Field) and UNSIGNED_FLAG) <> 0
    then
      Result := ' UNSIGNED';
    if (mysql_field_flag(mySQL_Field) and AUTO_INCREMENT_FLAG) <> 0
    then
      Result := Result + ' INC';
  end
  else begin
    if (mysql_field_flag(mySQL_Field) and ENUM_FLAG)<>0
    then
      Result := ' ENUM'
    else
    if (mysql_field_flag(mySQL_Field) and SET_FLAG)<>0
    then
      Result := ' SET'
    else
    if (mysql_field_flag(mySQL_Field) and BLOB_FLAG)<>0
    then
      Result := ' BLOB';
  end;
  if IS_NOT_NULL(mysql_field_flag(mySQL_Field))
  then
    Result := Result + ' NOT NULL';
end;

procedure TForm1.TableListBoxClick(Sender: TObject);
var
  i, r, field_count, row_count: Integer;
  mySQL_Res: PMYSQL_RES;
  MYSQL_ROW: PMYSQL_ROW;
  mySQL_Field: PMYSQL_FIELD;
  sql: String;
  tablename: String;
begin
  ClearGrid(FieldListGrid);
  with TableListBox do
    tablename := Items[ItemIndex];
  tablename := DoQuote(tablename);

  sql := 'select * from ' + tablename;
  if mysql_real_query(ConHandle, PChar(sql), Length(sql))<>0
  then
    raise Exception.Create(mysql_error(ConHandle));
  mySQL_Res := mysql_store_result(ConHandle);
  if mySQL_Res<>nil
  then begin
    try
     
      field_count := mysql_num_fields(mySQL_Res);
      FieldListGrid.RowCount := field_count+1;
      TableStringGrid.ColCount := field_count;
      for i := 0 to field_count - 1 do
      begin
        mySQL_Field := mysql_fetch_field(mySQL_Res);
        if mySQL_Field<>nil
        then begin
          TableStringGrid.Cells[i, 0] := mysql_field_name(mySQL_Field);
          FieldListGrid.Cells[0, i+1] := mysql_field_name(mySQL_Field);
          FieldListGrid.Cells[1, i+1] := GetFieldTypeString(mySQL_Field);
          FieldListGrid.Cells[2, i+1] := IntToStr(mysql_field_length(mySQL_Field));
          FieldListGrid.Cells[3, i+1] := GetFieldFlagString(mySQL_Field);
        end;
      end;
      //Get Data
      row_count := mysql_num_rows(mySQL_Res);
      if row_count>0
      then begin
        TableStringGrid.RowCount := row_count + 1;
        for r := 1 to row_count do
        begin
          MYSQL_ROW := mysql_fetch_row(mySQL_Res);
          if MYSQL_ROW<>nil
          then begin
            for i := 0 to field_count - 1 do
              TableStringGrid.Cells[i, r] := MYSQL_ROW^[i];
          end;
        end;
      end
      else begin
        TableStringGrid.RowCount := 2;
        for i := 0 to field_count - 1 do
          TableStringGrid.Cells[i, 1] := '';
      end;
    finally
      mysql_free_result(mySQL_Res);
    end;
  end;
end;

end.
hier auch die beta version zum Downloaden im Anhang

[edit=mkinzler]Code-Tag durch Delphi-Tag ersetzt Mfg, mkinzler[/edit]

mkinzler 26. Apr 2009 21:50

Re: MySQL Daten Bank Editor
 
Scheint aber Win32 und kein .Net zu sein.

DP-Maintenance 26. Apr 2009 21:51

DP-Maintenance
 
Dieses Thema wurde von "mkinzler" von "Neuen Beitrag zur Code-Library hinzufügen" nach "Datenbanken" verschoben.
Kein Vorschlag zur CodeLibrary sondern eine Frage

Natura 26. Apr 2009 22:03

Re: MySQL Daten Bank Editor
 
Ja natürlich sorry ist win 32 hatte mich verdrückt.

//PS. so besser habe es geändert

mkinzler 26. Apr 2009 22:04

Re: MySQL Daten Bank Editor
 
Dann ändere das Bitte.

Natura 27. Apr 2009 09:33

Re: MySQL Daten Bank Editor
 
mhhhhh?????

Jürgen Thomas 27. Apr 2009 09:34

Re: MySQL Daten Bank Editor
 
Delphi-Code wäre die bessere (lesbarere) Variante zum Formatieren des Quellcodes (bitte den Eingangsbeitrag nochmal überarbeiten).

Ich verstehe deine Probleme nicht:

Zitat:

// Edior Feld für beide Tabellen
Für welche "beiden" Tabellen soll es ein Editor-Feld geben? Was soll dort eingegeben werden und zu welchem Zweck?

Zitat:

// Logout Button
Wie wäre es mit einem Button, der Connection.Close ausführt?

Zitat:

// Ein Button um eine tabelle zu einzufügen
Wie wäre es mit einem Button, der einen SQL-Befehl "CREATE TABLE ..." erstellt und ausführt?

Zu den Möglichkeiten, die MySql dazu bietet, siehe u.a. Create Table.

Gruß Jürgen

Natura 27. Apr 2009 10:12

Re: MySQL Daten Bank Editor
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke das mit dem logout button hab ich eine andere variante gewält. Ja ein button mit dem man eine CREATE TABLE ausführt

mit dem editor feld möschte ich einträge in den sql tabellen bearbeiten wie bei Nvicat+MySQL (http://www.navicat.com/)

Hier 1 Bilde so wie es Fertig aussehen soll.

s. Anhang


[edit=Admin]Bild in den Anhang verfrachtet. Mfg, Daniel[/edit]

Phoenix 27. Apr 2009 14:19

Re: MySQL Daten Bank Editor
 
Das kann so nicht funktionieren.
Bei den Spalten musst Du ja noch Zusatzinformationen wie Datentyp etc. angeben können. Nur der Name reicht nicht.

Schau Dir mal an, wie die Jungs von HeidiSQL das gelöst haben. HeidiSQL ist übrigens auch mit Delphi geschrieben und OpenSource. Das heisst Du kannst da gucken wie das im Detail gemacht wurde, und HeidiSQL ist ein geniales Management-Tool für MySQL-Datenbanken.

Natura 27. Apr 2009 16:48

Re: MySQL Daten Bank Editor
 
Hidisql ist gut aber nicht ganz das was ich wollte gibt es auc hidisql componeten für delphi 7 habe nur welche für delphi 10 und 11 gibt es auch einen anderen weg z.B das ich direckt an den tabelen die einträge bearbeiten kann. wie z.B bei Navicat

Phoenix 27. Apr 2009 16:58

Re: MySQL Daten Bank Editor
 
Nein. Manipulationen an den Tabellen in MySQL geht ausschliesslich über SQL-Statements.
Dir bleibt also im Endeffekt nichts über als SQL anhand der Nutzereingaben zusammenzubauen und das an die Datenbank zu schicken.

Natura 27. Apr 2009 19:16

Re: MySQL Daten Bank Editor
 
Und wie stell iuch das an wie gesagt ich habe nicht viel ahnung mache das erst seit nem jahr

Jürgen Thomas 28. Apr 2009 08:07

Re: MySQL Daten Bank Editor
 
Steht doch schon in #7:
Zitat:

Zitat von Jürgen Thomas
... der einen SQL-Befehl "CREATE TABLE ..." erstellt und ausführt?

Zu den Möglichkeiten, die MySql dazu bietet, siehe u.a. Create Table.

Es wäre schön, wenn solche Hinweise gelesen und verarbeitet werden. Ich hatte "mit Absicht" auf die MySql-Dokumentation hingewiesen.

Eine Variante wäre ein Grid, in dem (wie bei deiner ListBox) zuerst alle neuen Felder eingetragen werden mit Feldname, Typ (Auswahl aus einer ComboBox), Nullable und ggf. max. Feldlänge. Aus diesen Angaben wird der Create-Befehl erstellt.

Ich weiß nicht mehr, welche Komponente als Grid geeignet ist (vor allem wegen der integrierten ComboBox), aber nach einem Jahr solltest du in der Delphi-ToolBox das passende Control finden.

Du solltest dir auch nochmal Gedanken über deine Struktur machen: Methoden (das ist ein C#-Ausdruck und umfasst Funktionen und Prozeduren), die etwas mit der Datenbank machen, sollten von der Benutzeroberfläche getrennt werden. Ein Click sollte nicht direkt auf die DB zugreifen, sondern eine Methode zur DB-Arbeit aufrufen. Ich finde es auch komisch, Formular-Methoden und allgemeine Methoden zu mischen. Auch verstehe ich nicht, warum du zweimal den vollständigen (?) Code zeigst; sollen wir untersuchen, was sich inzwischen geändert hat?

Gruß Jürgen

PS. "Erst seit einem Jahr" sagt nicht viel aus: Je nachdem, womit sich vorwiegend beschäftigt, kann man in dieser Zeit vieles über Formulare und/oder SQL und/oder Netzwerk usw. lernen. Aber das Nachlesen in Dokumentationen sollte dir geläufig sein.

samso 28. Apr 2009 16:49

Re: MySQL Daten Bank Editor
 
@Natura - Vielleicht solltest Du der fairness halber mal erwähnen, dass es sich bei dem unter #1 gezeigten Quellcode um eine fast identische Kopie meines Demoprogramms zur Bibliothek "mysql.pas" handelt (zu finden hier im Forum). Allerdings in einer alten Version. Dein eigener Beitrag beschränkt sich eigentlich auf das Hinzufügen eines "SkinManagers".

Natura 28. Apr 2009 17:38

Re: MySQL Daten Bank Editor
 
Ja das stimmt ich hatte mysql.pas teilweise als vorlage. nein mein beitrag geht es nicht darum sondern um einen editor bzuw eine erweiterung um die Datenbank zu bearbeiten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:16 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