Autor Beitrag
Naxor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 76

alle
delphi, C++, php, html, java, flash, XML
BeitragVerfasst: Mi 08.04.09 17:19 
Hi ich möchte gern einen Datenbank editor erstellen womit ich meine MySQL datenbank bearbeiten kann.

gibt es dafür zufällig ne anleitung oder nen demo script habe hier zwar schon einiges gefunden diese mir aber nicht wirklich helfen konnten


MFG Naxor
Mike19
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 256

Win XP, Vista, Win 7
Delphi 2005, Turbo Delphi
BeitragVerfasst: Mi 08.04.09 18:16 
Hallo,

vieleicht hilft das weiter www.audio-data.de/mysql.html.

Gruss Micha
Naxor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 76

alle
delphi, C++, php, html, java, flash, XML
BeitragVerfasst: Mi 22.04.09 13:56 
Danke deine antwort hat mir sehr geholfen und funktioniert auch alles super.

Nur leider kann ich die Datenbank nicht bearbeiten wie füge ich einen editor ein bzw wie kann ich die tabellen bearbeiten.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
unit unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls, ExtCtrls, mysql;

type
  TForm1 = class(TForm)
    HostEdit: TEdit;
    Bevel1: TBevel;
    Label1: TLabel;
    Label2: TLabel;
    UserEdit: TEdit;
    Label3: TLabel;
    PasswordEdit: TEdit;
    LoginButton: TButton;
    DatabaseListBox: TListBox;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    TableListBox: TListBox;
    TableStringGrid: TStringGrid;
    Label7: TLabel;
    FieldListGrid: TStringGrid;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure LoginButtonClick(Sender: TObject);
    procedure DatabaseListBoxClick(Sender: TObject);
    procedure TableListBoxClick(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));
  //Get Tablenames
  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[00] := 'Name';
  FieldListGrid.Cells[10] := 'Type';
  FieldListGrid.Cells[20] := 'Len';
  FieldListGrid.Cells[30] := '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),
                                  nil0nil0);
  if ConHandle=nil
  then
    raise Exception.Create(mysql_error(LibHandle));
  Caption := HostEdit.Text + ' '  + mysql_get_server_info(ConHandle);
  //Get Databasenames
  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
      //Get Fieldnames
      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.
Naxor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 76

alle
delphi, C++, php, html, java, flash, XML
BeitragVerfasst: Do 23.04.09 09:29 
Hat jemand eine lösung dazu.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10184
Erhaltene Danke: 1259

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 23.04.09 14:56 
Moin!

Vorab: Schiebung ist hier erst nach frühestens 24 Stunden erlaubt! :|

Schau mal hier, vielleicht kommst du damit weiter. :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
ub60
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 765
Erhaltene Danke: 130



BeitragVerfasst: Do 23.04.09 18:48 
Es wäre ev. auch sinnvoll, den kompletten Quelltext (pas, dfm, dpr, res - gepackt) hier zu posten. Eventuell findet man da schneller die Zeit, die Sourcen mal zu testen.

ub60
Naxor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 76

alle
delphi, C++, php, html, java, flash, XML
BeitragVerfasst: So 26.04.09 00:24 
Na Klar kein Problem. Hoffe das Ihr mir weiter helfen Könnt.
das orginal habe ich von www.audio-data.de/mysql.html. runtergeladen und dann dem entsprechend umgeschrieben. bzw ein paar sachen verändert.

MFG Naxor
Einloggen, um Attachments anzusehen!