Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   PAnsiChar um weiteres PAnsiChar ergänzen (https://www.delphipraxis.net/188137-pansichar-um-weiteres-pansichar-ergaenzen.html)

hedie 3. Feb 2016 14:20

PAnsiChar um weiteres PAnsiChar ergänzen
 
Hallo zusammen

Meine verwendete Funktion, mysql_real_query, erwartet als "Query" ein PAnsiChar.

Ich habe dies wie folge versucht:


Delphi-Quellcode:
function GetColumnCount(ForTable: PAnsiChar; InDatabase: PAnsiChar):integer;
var
  Query:PAnsiChar;

begin
    Query := 'SELECT * FROM COLUMNS WHERE TABLE_SCHEMA = '''+InDatabase+''' AND TABLE_NAME = '''+ForTable+'';
    //Query := 'SELECT * FROM COLUMNS WHERE TABLE_SCHEMA = ''mydata'' AND TABLE_NAME = ''mytable''';

    mysql_real_query(dbCon,Query,Length(Query));
end;
Mit der Auskommentierten Version klappts.
Mit der jetzt aktiven kommt "Inkompatible Typen: PansiChar und string"

Macht soweit eigentlich noch ein wenig Sinn für mich.
Ändere ich wie folgt:

Delphi-Quellcode:
Query := PAnsiChar(PAnsiString('SELECT * FROM COLUMNS WHERE TABLE_SCHEMA = '''+InDatabase+''' AND TABLE_NAME = '''+ForTable+''));
Ist die Fehlermeldung weg, wobei mir MySQL meldet dass "S" keine gültige SQL Abfrage ist.
Im Query befindet sich dann nur noch das Zeichen "S" von "SELECT..."

Kann mir jemand Helfen?

nahpets 3. Feb 2016 14:26

AW: PAnsiChar um weiteres PAnsiChar ergänzen
 
Keine Ahnung, ob ich jetzt eventuell auf 'nem total falschen Dampfer unterwegs bin. Hätte es so gemacht:
Delphi-Quellcode:
function GetColumnCount(ForTable: PAnsiChar; InDatabase: PAnsiChar):integer;
var
  Query: String;

begin
    Query := 'SELECT * FROM COLUMNS WHERE TABLE_SCHEMA = '''+InDatabase+''' AND TABLE_NAME = '''+ForTable+'';
    //Query := 'SELECT * FROM COLUMNS WHERE TABLE_SCHEMA = ''mydata'' AND TABLE_NAME = ''mytable''';
    // Damit es keine Hochkomma(verzähl)orgien gibt:
    Query := Format('SELECT * FROM COLUMNS WHERE TABLE_SCHEMA = %s AND TABLE_NAME = %s', [QuotedStr(InDatabase),QuotedStr(ForTable)]);
    mysql_real_query(dbCon,PAnsiChar(Query),Length(Query));
end;

Jumpy 3. Feb 2016 14:26

AW: PAnsiChar um weiteres PAnsiChar ergänzen
 
Hinter das Fortable müssen 4 Gänsefüßchen!


+ForTable+'''';

hedie 3. Feb 2016 14:31

AW: PAnsiChar um weiteres PAnsiChar ergänzen
 
Zitat:

Zitat von nahpets (Beitrag 1329271)
Keine Ahnung, ob ich jetzt eventuell auf 'nem total falschen Dampfer unterwegs bin. Hätte es so gemacht:
Delphi-Quellcode:
unction GetColumnCount(ForTable: PAnsiChar; InDatabase: PAnsiChar):integer;
var
  Query: String;

begin
    Query := 'SELECT * FROM COLUMNS WHERE TABLE_SCHEMA = '''+InDatabase+''' AND TABLE_NAME = '''+ForTable+'';
    //Query := 'SELECT * FROM COLUMNS WHERE TABLE_SCHEMA = ''mydata'' AND TABLE_NAME = ''mytable''';

    mysql_real_query(dbCon,PAnsiChar(Query),Length(Query));
end;

Danke für den Vorschlag.
Kommt leider weiterhin die Meldung dass "S" keine gültige Syntax sei.
mit dem Auskommentierten Query funktioniert es einwandfrei.

Danke, es mussten tatsächlich vier gänsefüsschen hinten dran :) :thumb:

Neutral General 3. Feb 2016 14:46

AW: PAnsiChar um weiteres PAnsiChar ergänzen
 
Das Ende muss so aussehen:

Delphi-Quellcode:
...+ForTable+'''';


Edit: Sorry ich hab scheinbar nur 10% des Threads gelesen :roll:

himitsu 3. Feb 2016 15:51

AW: PAnsiChar um weiteres PAnsiChar ergänzen
 
Delphi 2009 oder neuer? (ich wette mal)
[EDIT] Jupp

Zitat:

Kommt leider weiterhin die Meldung dass "S" keine gültige Syntax sei.
Delphi-Quellcode:
var
  Query: String;

Und ich wette, daß der Compiler eine WARNUNG ausgibt, vonwegen String UnicodeString und PAnsiChar. :roll:

hoika 3. Feb 2016 16:02

AW: PAnsiChar um weiteres PAnsiChar ergänzen
 
Hallo,
PChars werden per StrCopy verkettet.

Aber ich würde auf jeden Fall auf String umstellen, in diesem Fall aber auf AnsiString (Query: AnsiString).

Heiko

hedie 4. Feb 2016 18:44

AW: PAnsiChar um weiteres PAnsiChar ergänzen
 
Danke für eure Antworten.

Ein umstellen auf String ist nicht ganz so trivial.
Ich verwende die MySQL.pas unit welche mit der limysql.dll spricht.

Einer von vielen Abschnitten sieht wie folgt aus:

Delphi-Quellcode:
var
  _mysql_real_query: function (_mysql: PMYSQL; q: PAnsiChar; length: longword): longint; stdcall;

function mysql_real_query(_mysql: PMYSQL; q: PAnsiChar; length: longword): longint;
begin
  if @_mysql_real_query=nil
  then
    LoadProcAddress(@_mysql_real_query, 'mysql_real_query');
  Result := _mysql_real_query(_mysql, q, length);
end;

Offensichtlich, erwartet die DLL hier ein PAnsiChar.
So wie es aussieht, bleibt mir der Weg über StrCpy nicht erspart.

hedie 4. Feb 2016 19:31

AW: PAnsiChar um weiteres PAnsiChar ergänzen
 
hab die Lösung:

Delphi-Quellcode:
PAnsiChar(AnsiString(stringVar));
Das ist alles!

Ergebnis:

Delphi-Quellcode:
var
  Query:PAnsiChar;
begin
...
  Query := PAnsiChar(AnsiString('SELECT * FROM COLUMNS WHERE TABLE_SCHEMA = '''+InDatabase+''' AND TABLE_NAME = '''+ForTable+''''));

himitsu 7. Feb 2016 16:20

AW: PAnsiChar um weiteres PAnsiChar ergänzen
 
Ich würde eher empfehlen das in UTF-8 zu konvertieren, anstatt nach ANSI.
Natürlich vorher die Connection auch auf UTF-8 eintellen.

Und es gibt garantiert eine "Quote"-Funktion, welche man statt
Delphi-Quellcode:
...'''+InDatabase+'''...
verwenden sollte.

Quasi so in etwa
Delphi-Quellcode:
...'+mysql_quote_name(InDatabase)+'...
.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:42 Uhr.
Seite 1 von 2  1 2      

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