Ich programmiere gerade eine MySQL-Anwendung, nämlich eine Art Kontoführung. Connect zum Server, Auswahl der Datenbank, Ausführen eines Selects und Anzeige der Ergebnisse in einer StringGrid, all das funzt schon gut. Nun taucht aber ein Problem auf, das mich inzwischen verzweifeln läßt (und auch intensive Suche im Forum und langwieriges Googeln bringt mich da nicht weiter Meine ganze Hoffnung liegt jetzt bei euch ...
Also, ich mache einen Select (mit mysql_query(socket, query)), stelle ihn mit mysql_store_result(socket) bereit, und lese ihn dann mit rowbuffer:=mysql_fetch_row Satz für Satz durch, dann kann ich über Index auf die einzelnen Felder des jeweiligen Datensatzes zugreifen und deren Inhalte z.B. mit einem writeln ausgeben. Das klappt auch. Diese Felder sind - soweit glaube ich, es verstanden zu haben, vom Typ AnsiString. Nun gibt es ja aber auch Felder, deren Inhalt ihrer Natur nach numerisch sind. Konkret: Ich habe ein Feld namens sh, dessen Inhalt 'S' oder 'H' sein kann - für "Soll" oder "Haben". Ein weiteres Feld namens Betrag enthält - uberraschenderweise - einen Betrag. Die Aufgabe ist nun, bein Durchlesen der Datensätze jedesmal, wenn sh='S' ist, den Betrag mit -1 zu multiplizieren. Dazu muß ich (jedenfalls sehe ich das so - belehrt mich gern eines Besseren ...), daß ich
1. das Feld Betrag von AnsiString in irgendwas numerisches (real, float, double, ...) konvertieren muß,
2. es mit -1 multiplizieren muß, und dann zwecks Anzeige dieses Ding
3. wieder in was anzeigbares (String, PChar, AnsiString oder was weiß ich ...) zurückkonvertieren muß.
Und genau das krieg ich nicht hin ...
Icch hab's schon mit 1000 verschiedenen Typkonvertierungen hin und her versucht, aber nur Fehlermeldungen geerntet. Die Frage ist eben schlicht: Wie kann ich einen AnsiString (?) in ein "rechenfähiges" Format konvertieren (und zurück)?
Hier das Programm, wie es bis jetzt aussieht (Unwichtiges habe ich rausgeschmissen, um euch nicht unnötig zu strapazieren ...)
Ganz herzlichen Dank schon mal!
Manfred
Code: Alles auswählen
program mysqltest;
//******************************************************************************
//** "Einfaches Programm" zum Testen von MySQL-Anbindungen.
//** Mit eigener Unit-Datei.
//******************************************************************************
//------------------------------------------------------------------------------
// Declarations
//------------------------------------------------------------------------------
uses
mysql4, mmaSQL;
Const
DBName : Pchar = 'xxxx';
DBUser : PChar = 'yyyy';
DBPass : PChar = 'zzzzzzzz';
Query : PChar = 'select * from r10d00 where konto="GITO" order by buchid limit 2';
var
sock : PMYSQL;
recbuf : PMYSQL_RES;
//------------------------------------------------------------------------------
begin
startmeldung(Signum);
sock := dbConnect(DBUser, DBPass); // Connecten
dbAuswaehlen(sock, DBName); // Datenbank auswählen (xxxx)
queryAusfuehren(sock, Query); // Query nun ausführen
recbuf := queryResultBereitstellen(sock); // Ergebnis in recbuf bereitstellen
ergebnisdatensaetze_anzeigen(recbuf);
end.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
unit mmasql;
interface
uses
Classes, SysUtils, MySQL4;
function dbConnect(User, Password: PChar) : PMYSQL;
procedure dbAuswaehlen(socket: PMYSQL; datenbankname: PChar);
procedure queryAusfuehren(socket: PMYSQL; Query: PChar);
function queryResultBereitstellen(socket: PMYSQL): PMYSQL_RES;
procedure ergebnisdatensaetze_anzeigen(recordbuffer: PMYSQL_RES);
procedure aufraeumen(socket: PMYSQL; recordbuffer: PMYSQL_RES);
//******************************************************************************
implementation
var qmysql : TMYSQL;
//------------------------------------------------------------------------------
function dbConnect(User, Password: PChar) : PMYSQL;
var socket : PMYSQL;
begin
mysql_init(PMySQL(@qmysql));
socket := mysql_real_connect(PMysql(@qmysql),nil,User,Password,nil,0,nil,0);
// <... Prüfungen ...>
Result := socket;
end;
//------------------------------------------------------------------------------
procedure dbAuswaehlen(socket: PMYSQL; datenbankname: PChar);
begin
if mysql_select_db(socket,datenbankname) < 0 then ...
// <... Programmabbruch ...>
end;
//------------------------------------------------------------------------------
procedure queryAusfuehren(socket: PMYSQL; Query: PChar);
begin
if (mysql_query(socket,Query) < 0 then ...
// <... Programmabbruch ...>
end;
//------------------------------------------------------------------------------
function queryResultBereitstellen(socket: PMYSQL): PMYSQL_RES;
var recordbuffer: PMYSQL_RES;
begin
recordbuffer := mysql_store_result(socket);
// <... Prüfungen ...>
Result := recordbuffer;
end;
//------------------------------------------------------------------------------
procedure ergebnisdatensaetze_anzeigen(recordbuffer: PMYSQL_RES);
var rowbuffer: TMYSQL_ROW;
begin
rowbuffer := mysql_fetch_row(recordbuffer);
while (rowbuffer <>nil) do
begin
WriteLn('BuchId : ', rowbuffer[ 2]);
WriteLn('Bet_Euro: ', rowbuffer[ 5]);
WriteLn('SH : ', rowbuffer[ 7]);
rowbuffer := mysql_fetch_row(recordbuffer);
end;
Writeln;
end;
//------------------------------------------------------------------------------
procedure aufraeumen(socket: PMYSQL; recordbuffer: PMYSQL_RES);
begin
mysql_free_result(recordbuffer);
mysql_close(socket);
end;
//------------------------------------------------------------------------------
end.
Bin für JEDE Hilfe dankbar !