Discussion:
FreePascal und MySQL
(zu alt für eine Antwort)
Volker Englisch
2005-04-15 16:23:49 UTC
Permalink
Hallo,

ich versuche mich gerade darin, ein Progrämmchen zu basteln, das Daten
aus MySQL extrahieren und dann weiterverarbeiten soll. Leider klappt's
irgendwie noch nicht. Ich bekomme immer die Fehlermeldung "Fehler bei
der Datenbankabfrage", also bei der Query. Ich verkopfe mich jetzt seit
Tagen, was an der Query innerhalb Pascals falsch sein könnte, ich komme
aber nicht drauf. Vielleicht sieht ja jemand von Euch auf Anhieb einen
Fehler im Programm:

Wenn ich folgende Query aus der Shell absetze:
mysql -u finanz -pxxxxxxxx -t -e"Select Zeile,Bezeichnung from \
Zeilen where Jahr=\"2005\" AND BGKZ=\"G\"" dbb000

bekomme ich ein Ergebnis (ist erst ein Testwert drin):

+------+------+-------+-------------+------+----------+
| Jahr | BGKZ | Zeile | Bezeichnung | User | Zugriff |
+------+------+-------+-------------+------+----------+
| 2005 | G | 100 | Irgendwas | EH | 20050414 |
+------+------+-------+-------------+------+----------+

Wenn ich mein Progrämmchen starte, kommt folgendes heraus:

select Zeile,Bezeichnung from Zeilen where Jahr="2005" and BGKZ="G"
BBGUV0C: Fehler bei der Datenbankabfrage

--- *** ---

program bbguv0;

uses SYSUTILS, MYSQL, LINUX;

const version = '0.0.1';
datenbank : pchar = 'dbb000';
benutzer = 'finanz';
passwort = 'xxxxxxxx';
ktabelle = 'Konten';
btabelle = 'Buchungen';
ztabelle = 'Zeilen';

var zeile: array[1..999] of string[40];
i: integer;

procedure initialisieren;
var i: integer;
begin
for i := 1 to 999 do zeile[i] := '';
end;

procedure zeilenlesen (jahr : integer);
var sock: pmysql;
qmysql: tmysql;
rowbuf: tmysql_row;
recbuf: pmysql_res;
query: pchar;
tquery: string;
dummy1: string;
dummy2: integer;
begin
str(jahr, dummy1);
tquery := concat('select zeile,bezeichnung from ', ztabelle, ' where ');
tquery := concat(tquery, 'jahr="', dummy1, '" and bgkz="G"');
query := stralloc(length(tquery) + 1);
sock := mysql_connect(pmysql(@qmysql),nil,benutzer,passwort);
if sock = nil then begin
writeln('BBGUV0A: Keine Verbindung zur Datenbank möglich');
strdispose(query);
exit;
end;
if mysql_select_db(sock, datenbank) < 0 then begin
writeln('GGBUV0B: Auswahl der Datenbank nicht möglich');
strdispose(query);
mysql_close(sock);
exit;
end;
if (mysql_query(sock, query) < 0) then begin
writeln('BBGUV0C: Fehler bei der Datenbankabfrage');
strdispose(query);
mysql_close(sock);
exit;
end;
recbuf := mysql_store_result(sock);
if (recbuf = nil) then begin
writeln('BBGUV0D: Keine Definitionszeilen gefunden');
mysql_close(sock);
exit;
end;
rowbuf := mysql_fetch_row(recbuf);
while (rowbuf <> nil) do begin
dummy1 := rowbuf[0];
val(dummy1, dummy2);
zeile[dummy2] := rowbuf[1];
end;
mysql_free_result(recbuf);
mysql_close(sock);
strdispose(query);
end;

begin
initialisieren;
zeilenlesen(2005);
for i := 1 to 999 do begin
if zeile[i] <> '' then writeln(i:3, ': ', zeile[i]);
end;
end.

--- *** ---

Ich danke schonmal und hoffe, daß ich nicht einfach nur blind bin ;-(

Volker
Sebastian Gebhardt
2005-04-16 09:57:09 UTC
Permalink
Post by Volker Englisch
mysql -u finanz -pxxxxxxxx -t -e"Select Zeile,Bezeichnung from \
Zeilen where Jahr=\"2005\" AND BGKZ=\"G\"" dbb000
Hallo Volker,

ohne es probiert zu haben: versuch es mal mit einfachen Anführungszeichen.

SELECT zeile, bezeichnung
FROM zeilen
WHERE jahr = '2005'
AND bgkz = 'G'

Falls jahr ein numerischer Feldtyp ist und nicht varchar, kannst du dir
die Anführungszeichen da auch sparen.

Sebastian

Loading...