SQL-Lesezugriff Linux-Console

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
BerLin
Beiträge: 50
Registriert: So 17. Jun 2007, 16:51

SQL-Lesezugriff Linux-Console

Beitrag von BerLin »

Hallo,

ich habe jetzt bereits Zeit versucht und gegoogelt, leider ohne Erfolg!
Ich muss auf auf eine SQL-Datenbank im Consolenmodus zugreifen und ein paar Daten lesen.
Der Zugriff als Lazarus-Anwendung gemäss: http://wiki.freepascal.org/MySQLDatabases/de funktioniert ohne Probleme.

Hier "mein" Quellcode (http://wiki.freepascal.org/SqlDBHowto/de):

program mysqlconsole;

{$mode objfpc}{$H+}

uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes,
{ you can add units after this }
sysutils,crt,dateutils,mysql56,mysql56conn,sqldb,db;
const myHost:string='localhost';
myUser:string='root';
myPswd:string='xxxx';
myTabl:string='tabelle1';

var AConnection:TSQLConnection;
ATransaction:TSQLTransaction;

Procedure CreateConnection;
begin
AConnection:=TSQLConnection.Create(Nil);
AConnection.Connected:=false;
AConnection.Hostname:=myHost;
AConnection.DatabaseName:=myTabl;
AConnection.UserName:=myUser;
AConnection.Password:=myPswd;
AConnection.Open;
end;

procedure CreateTransaction;
begin
ATransaction:=TSQLTransaction.Create(Nil);
ATransaction.Database:=AConnection;
AConnection.Transaction:=ATransaction;
end;

function GetQuery:TSQLQuery;
var AQuery:TSQLQuery;
begin
AQuery:=TSQLQuery.Create(Nil);
AQuery.Database:=AConnection;
AQuery.Transaction:=ATransaction;
GetQuery:=AQuery;
end;

procedure read_systems;
var Query:TSQLQuery;
dmy:String;
i,err:integer;
begin
PBLst.Clear;
CreateConnection;
if Aconnection.Connected then begin
writeln('Erfolgreich verbunden!');
CreateTransaction;
Query:=GetQuery;
Query.SQL.Text:= 'SELECT * FROM FELD1 ORDER BY FELD2';
AConnection.Open;
Query.Open; <<< CRASH EAbstractError: Abstract method called >>>
while not Query.Eof do begin
dmy:=Query.FieldByName('serial_number').AsString;
writeln (dmy);
Query.Next;
end;
Query.Close;
AConnection.Close;
Query.Free;
ATransaction.Free;
AConnection.Free;
end
else begin
writeln('Es konnte keine Verbindung zur Datenbank erstellt werden. ');
end;
end;

begin
clrscr;
read_systems;
end.

Der Compiler gibt mehrere Warnungen aus:
Projekt kompilieren, Ziel: mysqlconsole: Erfolg, Warnungen: 16, Hinweise: 1
mysqlconsole.lpr(66,41) Warning: Constructing a class "TSQLConnection" with abstract method "AllocateCursorHandle"
mysqlconsole.lpr(66,41) Warning: Constructing a class "TSQLConnection" with abstract method "DeAllocateCursorHandle"
..............................


Vielen Dank für eure Unterstüzung
BerLin
Lazarus 1.6-i386
FPC-3.0.0
Server-Version: 10.0.25-MariaDB - openSUSE
Datenbank-Client Version: libmysql - mysqlnd 5.0.11-dev - 20120503
PHP-Version: 5.6.1

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: SQL-Lesezugriff Linux-Console

Beitrag von Michl »

BerLin hat geschrieben:Query.Open; <<< CRASH EAbstractError: Abstract method called >>>
Wie die Fehlermeldung schon besagt, hast du eine Query, die auf eine abstrakte Methode zugreift. Das liegt daran, dass du die Query mit einer abstrakten Connection verbunden hast.

Nimm statt einer TSQLConnection eine TMySQL56Connection, dann sollte dieser Fehler verschwinden.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

BerLin
Beiträge: 50
Registriert: So 17. Jun 2007, 16:51

Re: SQL-Lesezugriff Linux-Console

Beitrag von BerLin »

Vielen Dank Michl,

das war das Problem!
Die ganzen verschiedenen Units finde ich unübersichtlich. Ich habe auch nicht herausgefunden, welche Unit zur MariaDB passt.

Viele Grüße
BerLin

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: SQL-Lesezugriff Linux-Console

Beitrag von Michl »

BerLin hat geschrieben:Ich habe auch nicht herausgefunden, welche Unit zur MariaDB passt.
Wie meinst du das? Du hast sie doch in der Uses-Clause verankert: Unit mysql56conn (abhängig von der Version der Datenbank) und dann entsprechend eine TMySQL56Connection nutzen :?:

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

BerLin
Beiträge: 50
Registriert: So 17. Jun 2007, 16:51

Re: SQL-Lesezugriff Linux-Console

Beitrag von BerLin »

Hallo Michl,

die Maria-DB hat Version "10.0.25-MariaDB". Ich sehe da keinen Bezug zu den Units. Ich habe einfach die neueren Units probiert.

Viele Grüße
BerLin

Antworten