Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   D09 MySQL C-API ExecQry (https://www.delphipraxis.net/160500-d09-mysql-c-api-execqry.html)

AMaurer 16. Mai 2011 15:19

Datenbank: MySQL • Version: 5.5 • Zugriff über: C-API

D09 MySQL C-API ExecQry
 
Hallo Ihr Experten.

Als Hobbyist steht man manchmal wie ein Ochse vorm Berg ...

Ich habe mich am Tutorial von Michael Puff langgehangelt. Änderungen mussten im Bereich String PAnsiChar vorgenommen werden, da das bekanntlich im D2009 anders läuft.

Ich habe Zugriff auf die DB (MySQL 5.5), kann Daten auslesen im Formular darstellen z. B. edit-Felder.

StringGrid funktioniert wie im Beispiel auch bis auf die Spaltennamen. Hier habe ich explixit folgendes Problem:

Aus Ihrem Tutorial, abgewandelt mit AnsiChar ...
function ExecQuery(const Datenbank, query: AnsiString; var Cols: TCols; var Rows: TRows): Boolean; var
MySQLRes: PMYSQL_RES;
MySQLRow: PMYSQL_ROW;
AffectedRows: Int64;
ColCount: Cardinal;
Field: PMYSQL_FIELD;
i: Integer;
j: Integer;
ErrorCode: Integer;
begin
// Datenbank auswählen
ErrorCode := mysql_select_db(Descriptor, PAnsiChar(Datenbank));
if ErrorCode = 0 then
begin
// Query ausführen
ErrorCode := mysql_real_query(Descriptor, PAnsiChar(query), length(query));
if ErrorCode = 0 then
begin
// Query speichern
MySQLRes := mysql_store_result(Descriptor);
if Assigned(MySQLRes) then
begin
// zurückgelieferte Anzahl der Spalten
ColCount := mysql_num_fields(MySQLRes);
SetLength(Cols, ColCount);
// Spalten-Array füllen
for i := 0 to ColCount - 1 do
begin
Field := mysql_fetch_field_direct(MySQLRes, i);
Cols[i] := Field.name;
...

Field.name bringt Compiler-Fehlermeldung: Record, Objekt oder Klassentyp erforderlich.
Wenn ich die Zeile Cols[i] := Field.Name auskommentiere läuft die Prozedur, die erste Zeile bleibt aber logischerweise in der nachfolgenden Funktion StringGrid füllen leer.

In der Referenz von MySQL-5.5 sind die Funktionen rund um mysql_fetch_field() beschrieben. Dementsprechend soll es .Name geben.

Habt Ihr eine Idee woran das liegt, dass .Name nicht funktioniert?


Danke für Eure Hilfe ...


Viele Grüße

Andreas

DeddyH 16. Mai 2011 15:27

AW: D09 MySQL C-API ExecQry
 
Ins Blaue geraten:
Delphi-Quellcode:
Cols[i] := Field^.name;
Klappt es so?

AMaurer 16. Mai 2011 16:58

AW: D09 MySQL C-API ExecQry
 
Zitat:

Zitat von DeddyH (Beitrag 1101149)
Ins Blaue geraten:
Delphi-Quellcode:
Cols[i] := Field^.name;
Klappt es so?

Auf diese Idee bin ich meiner gestrigen Verzweiflung auch schon gekommen. Habe es eben noch einmal probiert. Leider ohne Erfolg.

VG Andreas

DeddyH 16. Mai 2011 17:13

AW: D09 MySQL C-API ExecQry
 
Kannst Du mal die Deklaration von PMYSQL_FIELD bzw. TMYSQL_FIELD posten?

AMaurer 16. Mai 2011 17:22

AW: D09 MySQL C-API ExecQry
 
Zitat:

Zitat von DeddyH (Beitrag 1101176)
Kannst Du mal die Deklaration von PMYSQL_FIELD bzw. TMYSQL_FIELD posten?

Here they are.
Sind direkt aus mysql.pas

TMYSQL_FIELD = TMYSQL_FIELD401;
PMYSQL_FIELD = Pointer;

AMaurer 16. Mai 2011 17:23

AW: D09 MySQL C-API ExecQry
 
Zitat:

Zitat von AMaurer (Beitrag 1101179)
Zitat:

Zitat von DeddyH (Beitrag 1101176)
Kannst Du mal die Deklaration von PMYSQL_FIELD bzw. TMYSQL_FIELD posten?

Here they are.
Sind direkt aus mysql.pas

TMYSQL_FIELD = TMYSQL_FIELD401;
PMYSQL_FIELD = Pointer;

und bevor Du noch einmal fragen musst ...

TMYSQL_FIELD401 = record
name: PAnsiChar; // Name of column
org_name: PAnsiChar; // Original column name, if an alias
table: PAnsiChar; // Table of column if column was a field
org_table: PAnsiChar; // Org table name if table was an alias
db: PAnsiChar; // Database for table
catalog: PAnsiChar; // Catalog for table
def: PAnsiChar; // Default value (set by mysql_list_fields)
length: longword; // Width of column
max_length: longword; // Max width of selected set
name_length: longword;
org_name_length: longword;
table_length: longword;
org_table_length: longword;
db_length: longword;
catalog_length: longword;
def_length: longword;
flags: longword; // Div flags
decimals: longword; // Number of decimals in field
charsetnr: longword; // Character set
_type: enum_field_types; // Type of field. Se mysql_com.h for types
end;

DeddyH 16. Mai 2011 18:21

AW: D09 MySQL C-API ExecQry
 
Das ist ja putzig. Bringt es etwas, wenn Du die Variabe einmal umbenennst? Ansonsten gehen mir auch die Ideen aus :(

AMaurer 16. Mai 2011 18:29

AW: D09 MySQL C-API ExecQry
 
Zitat:

Zitat von DeddyH (Beitrag 1101199)
Das ist ja putzig. Bringt es etwas, wenn Du die Variabe einmal umbenennst? Ansonsten gehen mir auch die Ideen aus :(

Also ... ich habe auch weitergesucht und in einer ältern mysql.pas folgende Deklaration gefunden:

type
PMYSQL_FIELD = ^TMYSQL_FIELD;
TMYSQL_FIELD = record
name: pChar; // Name of column
table: pChar; // Table of column if column was a field
def: pChar; // Default value (set by mysql_list_fields)
_type: enum_field_types; // Type of field. Se mysql_com.h for types
length: longword; // Width of column
max_length: longword; // Max width of selected set
flags: longword; // Div flags
decimals: longword; // Number of decimals in field
end;

Wie Du siehst steht dort oben: PMYSQL_FIELD = ^TMYSQL_FIELD;

Diese Verbindung fehlt uns in der "neuen" mysql.pas. (Nein, die alte läuft nicht unter D2009 pChar und nicht pAnsiChar).

Wenn ich Field : TMYSQL_Field deklariere kann ich zwar .Name auswählen. Dann habe ich aber das Problem, dass Field nun ein Record ist und mein Ergebnis ein Zeiger ...

Noch ne Idee?

VG Andreas

DeddyH 16. Mai 2011 18:33

AW: D09 MySQL C-API ExecQry
 
Dann versuch doch einmal einen harten Cast.
Delphi-Quellcode:
Cols[i] := TMYSQL_FIELD(Field^).name;

AMaurer 16. Mai 2011 20:23

AW: D09 MySQL C-API ExecQry
 
Zitat:

Zitat von DeddyH (Beitrag 1101203)
Dann versuch doch einmal einen harten Cast.
Delphi-Quellcode:
Cols[i] := TMYSQL_FIELD(Field^).name;

Hallo Detlef,

da sieht man den Unterschied ziwschen einem Können und einem Hobbyisten.
Es FUNKTIONIERT. DANKE :thumb:

VG Andreas


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz