![]() |
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 |
AW: D09 MySQL C-API ExecQry
Ins Blaue geraten:
Delphi-Quellcode:
Klappt es so?
Cols[i] := Field^.name;
|
AW: D09 MySQL C-API ExecQry
Zitat:
VG Andreas |
AW: D09 MySQL C-API ExecQry
Kannst Du mal die Deklaration von PMYSQL_FIELD bzw. TMYSQL_FIELD posten?
|
AW: D09 MySQL C-API ExecQry
Zitat:
Sind direkt aus mysql.pas TMYSQL_FIELD = TMYSQL_FIELD401; PMYSQL_FIELD = Pointer; |
AW: D09 MySQL C-API ExecQry
Zitat:
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; |
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 :(
|
AW: D09 MySQL C-API ExecQry
Zitat:
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 |
AW: D09 MySQL C-API ExecQry
Dann versuch doch einmal einen harten Cast.
Delphi-Quellcode:
Cols[i] := TMYSQL_FIELD(Field^).name;
|
AW: D09 MySQL C-API ExecQry
Zitat:
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 19:25 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