AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

D09 MySQL C-API ExecQry

Ein Thema von AMaurer · begonnen am 16. Mai 2011 · letzter Beitrag vom 16. Mai 2011
Antwort Antwort
AMaurer

Registriert seit: 14. Dez 2010
34 Beiträge
 
Delphi 11 Alexandria
 
#1

D09 MySQL C-API ExecQry

  Alt 16. Mai 2011, 15:19
Datenbank: MySQL • Version: 5.5 • Zugriff über: C-API
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: D09 MySQL C-API ExecQry

  Alt 16. Mai 2011, 15:27
Ins Blaue geraten:
Cols[i] := Field^.name; Klappt es so?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
AMaurer

Registriert seit: 14. Dez 2010
34 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: D09 MySQL C-API ExecQry

  Alt 16. Mai 2011, 16:58
Ins Blaue geraten:
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: D09 MySQL C-API ExecQry

  Alt 16. Mai 2011, 17:13
Kannst Du mal die Deklaration von PMYSQL_FIELD bzw. TMYSQL_FIELD posten?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
AMaurer

Registriert seit: 14. Dez 2010
34 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: D09 MySQL C-API ExecQry

  Alt 16. Mai 2011, 17:22
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;
  Mit Zitat antworten Zitat
AMaurer

Registriert seit: 14. Dez 2010
34 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: D09 MySQL C-API ExecQry

  Alt 16. Mai 2011, 17:23
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;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: D09 MySQL C-API ExecQry

  Alt 16. Mai 2011, 18:21
Das ist ja putzig. Bringt es etwas, wenn Du die Variabe einmal umbenennst? Ansonsten gehen mir auch die Ideen aus
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
AMaurer

Registriert seit: 14. Dez 2010
34 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: D09 MySQL C-API ExecQry

  Alt 16. Mai 2011, 18:29
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: D09 MySQL C-API ExecQry

  Alt 16. Mai 2011, 18:33
Dann versuch doch einmal einen harten Cast.
Cols[i] := TMYSQL_FIELD(Field^).name;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
AMaurer

Registriert seit: 14. Dez 2010
34 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: D09 MySQL C-API ExecQry

  Alt 16. Mai 2011, 20:23
Dann versuch doch einmal einen harten Cast.
Cols[i] := TMYSQL_FIELD(Field^).name;
Hallo Detlef,

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

VG Andreas
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:28 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