Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Inkompatible Typen String und PAnsiChar


JungerIslaender - Fr 08.05.09 13:49
Titel: Inkompatible Typen String und PAnsiChar
Hi ich habe einen Fehler in meinem programm und komm einfach nicht mehr weiter.
Hier:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm2.Button1Click(Sender: TObject);
var dbname:String;
begin
  dbname:= Edit1.text;
  query := 'CREATE DATABASE '+dbname;
  mysql_real_query(_myCon, query, Length(query));
end;

kommt der Fehler Ikompatible Typen String und PAnsiChar. Selbst wenn dbname ein PChar ist kommt der fehler. query ist dabei ein pchar allerdings in unit1 deklariert. Acuh wenn ich dbname mit PChar() umwandle kommt der fehler.

Was nun???


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Fr 08.05.2009 um 14:49


Narses - Fr 08.05.09 13:54

Moin!

Schau dir mal diese Komponente hier [http://www.delphi-forum.de/topic_TMySQLConnection+v101++Einfache+MySQLKommunikation_91761.html] an, damit solltest du deutlich einfacher klar kommen, als mit der API direkt. :idea: ;)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm2.Button1Click(Sender: TObject);
  var
    Query: String;
begin
  Query := 'CREATE DATABASE '+Edit1.Text;
  mysql_real_query(_myCon, PChar(Query), Length(Query));
end;
So sollte das eigentlich klappen.

cu
Narses


BenBE - Fr 08.05.09 13:54

Häh, wie in Unit1 deklariert?


JungerIslaender - Fr 08.05.09 14:13

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Häh, wie in Unit1 deklariert?

naja im var teil von unit 1 steht im var teil folgendes:


Delphi-Quelltext
1:
 var query: PChar;                    


Und zu narses nein das geht nicht weil die funktion mysql_real_query halt ein pchar braucht.(ich möchte das erst noch mit der libmysql.dll versuchen) Das merkwürdige ist das query ein pchar ist das programm mir aber sagt inkompatible typen string und pchar und mit string query meint. Habe deshlab testweise eine integer variable genommen.

Das heißt delphi meint das query ein string ist obwohl es ein pchar ist und pchar<>string. Sogar wenn dbname:pchar; geht es nicht.


jaenicke - Fr 08.05.09 14:34

user profile iconJungerIslaender hat folgendes geschrieben Zum zitierten Posting springen:
naja im var teil von unit 1 steht im var teil folgendes:
Du benutzt doch da nicht ernsthaft nicht nur eine globale Variable sondern auch noch eine aus einer anderen Unit?!? :shock:

Welche Fehlermeldung kommt denn bei user profile iconNarses Code?


JungerIslaender - Fr 08.05.09 14:38

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
]Du benutzt doch da nicht ernsthaft nicht nur eine globale Variable sondern auch noch eine aus einer anderen Unit?!? :shock:
Doch ja, warum nicht??

[Fehler] Unit1.pas(68): E2010 Inkompatible Typen: 'string' und 'PAnsiChar' taucht dann in jeder zeile wo mysql_real_query() steht auf.


jaenicke - Fr 08.05.09 14:46

Da du die aber noch einmal lokal deklariert hast, benutzt du die globale Variable ja gar nicht. Wenn trotz des Casts diese Fehlermeldung auftaucht, dann stimmt da etwas nicht... :gruebel:


Narses - Fr 08.05.09 15:00

Moin!

user profile iconJungerIslaender hat folgendes geschrieben Zum zitierten Posting springen:
nein das geht nicht weil die funktion mysql_real_query halt ein pchar braucht.
Was geht nicht? Du bist sicher, dass du den Code von mir verstanden hast? :gruebel:

cu
Narses


jaenicke - Fr 08.05.09 15:02

Mach einfach mal einen kleinen Screenie mit dem Code von user profile iconNarses und dem Fehler dann...


JungerIslaender - Fr 08.05.09 15:07

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm2.Button1Click(Sender: TObject);
  var
    Query: String;
begin
  Query := 'CREATE DATABASE '+Edit1.Text;
  mysql_real_query(_myCon, PChar(Query), Length(Query));
end;

das hab ich gemacht(hab query halt nur in unit1) und dann kommt über all wo ich die funktion mysql_real_query benutze der folgende fehler: [Fehler] Unit1.pas(68 ): E2010 Inkompatible Typen: 'string' und 'PAnsiChar'

Moderiert von user profile iconNarses: Zitat repariert


Narses - Fr 08.05.09 15:13

Moin!

user profile iconJungerIslaender hat folgendes geschrieben Zum zitierten Posting springen:
das hab ich gemacht(hab query halt nur in unit1)
Was hälst du denn davon, das mal genau so zumachen, wie ich es geschrieben habe (und alle anderen Stellen zunächst mal auszukommentieren), damit zumindest klar ist, ob es so geht? :nixweiss:

user profile iconJungerIslaender hat folgendes geschrieben Zum zitierten Posting springen:
und dann kommt über all wo ich die funktion mysql_real_query benutze der folgende fehler: [Fehler] Unit1.pas(68 ): E2010 Inkompatible Typen: 'string' und 'PAnsiChar'
Das bezieht sich aber doch auf den restlichen Code, richtig? :gruebel: Da ich/wir den nicht kennen, können wir auch schlecht was dazu sagen... :roll:

cu
Narses


jaenicke - Fr 08.05.09 15:15

Also wenn du es nicht glaubst... siehe Screenshot...
Da kommt nur eine Warnung wegen der MySQL Variable.

// EDIT:
Im restlichen Code fehlt vielleicht einfach die lokale String-Variable, kann das sein?!?


JungerIslaender - Fr 08.05.09 20:50


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm2.Button1Click(Sender: TObject);
var dbname:PChar; query:PChar; _mycon: PMySQL;
begin
  query := 'CREATE DATABASE '+dbname;
  mysql_real_query(_myCon, query, Length(query));
end;



Quelltext
1:
[Fehler] Unit2.pas(31): E2010 Inkompatible Typen: 'string' und 'PAnsiChar'                    


Hab alles andere ausgeklammert.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm2.Button1Click(Sender: TObject);
var dbname:PChar; query:PChar; _mycon: PMySQL;
begin
  query := 'CREATE DATABASE Testdatenbank';
  mysql_real_query(_myCon, query, Length(query));
end;

Das hingegen funktioniert, ich möchte den namen der db aber über ein editfeld realisieren.


jaenicke - Fr 08.05.09 20:54

Da sollte der Fehler aber in der ersten Zeile kommen... :autsch:
Das müsste so richtig sein:

Delphi-Quelltext
1:
  query := PChar('CREATE DATABASE '+dbname);                    
Allerdings sollte das mit String für query funktionieren, was kommt denn dann für ein Fehler, das war ja der Vorschlag von ganz oben...
Dass es damit geht, habe ich ja im Screenshot gezeigt.


JungerIslaender - Fr 08.05.09 21:02

Ich seh zwar nicht wer das schon als Lösungsansatz gebracht hatte :D, aber es Funtioniert^^

Also danke!!!!!


jaenicke - Fr 08.05.09 21:04

Die erste Antwort sollte aber genauso funktionieren und wäre eigentlich die passendere Lösung. Dass die klappt siehst du ja in meinem Screenshot. ;-)

Aber Hauptsache es klappt... ;-)


BenBE - Fr 08.05.09 22:38

@jaenicke: Dieser Ansatz erlaubt SQL-Injections. Bitte korrekt demonstrieren, wie Escaping funktioniert!


Narses - Sa 09.05.09 11:17

Moin!

user profile iconJungerIslaender hat folgendes geschrieben Zum zitierten Posting springen:
Ich seh zwar nicht wer das schon als Lösungsansatz gebracht hatte
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Die erste Antwort sollte aber genauso funktionieren und wäre eigentlich die passendere Lösung.
Und vor allem ist das nicht PChar-basiert, da der Speicher an einem String-Typ hängt und so nicht die Gefahr besteht, dass man (Compiler-Magic-verwalteten) Speicher abhängt! was mir beim vermuteten Wissensstand des Threadersteller praktisch als sicher gilt

user profile iconJungerIslaender hat folgendes geschrieben Zum zitierten Posting springen:
aber es Funtioniert^^
"Empirischer Programmierstil", klasse Konzept. "Funktioniert" so lange, bis du auf eine Eingabe triffst oder jemand eine Vorgehensweise anwendet, mit der du nicht gerechtest hast (oder noch schlimmer: die du gar nicht kanntest)... :roll:

Viel Erfolg noch
Narses