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
Narses: Topic aus Sonstiges (Delphi) verschoben am Fr 08.05.2009 um 14:49
BenBE - Fr 08.05.09 13:54
Häh, wie in Unit1 deklariert?
JungerIslaender - Fr 08.05.09 14:13
BenBE hat folgendes geschrieben : |
| Häh, wie in Unit1 deklariert? |
naja im var teil von unit 1 steht im var teil folgendes:
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
JungerIslaender hat folgendes geschrieben : |
| 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
Narses Code?
JungerIslaender - Fr 08.05.09 14:38
jaenicke hat folgendes geschrieben : |
| ]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!
JungerIslaender hat folgendes geschrieben : |
| 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
Narses und dem Fehler dann...
JungerIslaender - Fr 08.05.09 15:07
Narses hat folgendes geschrieben : |
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
Narses: Zitat repariert
Narses - Fr 08.05.09 15:13
Moin!
JungerIslaender hat folgendes geschrieben : |
| 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:
JungerIslaender hat folgendes geschrieben : |
| 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!
JungerIslaender hat folgendes geschrieben : |
| Ich seh zwar nicht wer das schon als Lösungsansatz gebracht hatte |
jaenicke hat folgendes geschrieben : |
| 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
"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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!