Lazarus (und ZEOS) Neuling sucht DB-Anschluß

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
br60
Beiträge: 10
Registriert: Di 26. Mär 2013, 20:39

Lazarus (und ZEOS) Neuling sucht DB-Anschluß

Beitrag von br60 »

Hallo Wissende,

ich bin schon älteren Semesters und habe vor langer Zeit mit Turbo-Pascal angefangen und über mehrere Delphi-Versionen nunmehr zu Lazarus und Free-Pascal gefunden. Die letzten Projekte waren schon mal größeren (Datenbank-)Ausmaßes und aus vielen Gründen ist die Datenbank meiner Wahl MSSQL in der kostenfreien Version also EXPRESS. Derzeit die Version 2008/SP2. Da läuft schon einiges an DB, daher will (und kann) ich nicht unbedingt wechseln.

Nun zum Problem. Ich verbinde mich bereits erfolgreich mit der DB, probiert habe ich ich SQL-DB, OBDC ud Zeos, hier über den Treiber ntwdblib.dll (der ja so was von alt und daher nicht wirklich mehr zu gebrauchen ist) und auch über msdblibr.dll aus der FreeTDS-Ecke. Das ist der letzte Stand.

Das Ergebnis ist leider immer gleich. Der SQL-Monitor von zeos zeigt mir, dass die Verbindung erfolgt, das einfache SELECT Statement jedoch wird in einer unendlichen Schleife (die ich nicht verzapft habe - denke ich jedenfalls) an die DB gesendet, das Programm friert somit ein...

Nun habe ich versucht mich hier und anderswo zu belesen, leider finde ich des Rätsels Lösung nicht. Findet jemand von Euch einen Moment und kann mir auf die Sprünge helfen?

Vielen Dank schon mal...
Bernd.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Lazarus (und ZEOS) Neuling sucht DB-Anschluß

Beitrag von Christian »

Ich hab bisher nur über Zeos,ntwdblib.dll auf mssql 2000 und 2005 gearbeitet. Das hat aber recht Problemlos geklappt.
Ab 2005 muss die Serverbezeichnung exakt stimmen (auch gross/kleinschreibung)
Absonsten gibts eigentlich nichts weiter zu beachten.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

br60
Beiträge: 10
Registriert: Di 26. Mär 2013, 20:39

Re: Lazarus (und ZEOS) Neuling sucht DB-Anschluß

Beitrag von br60 »

Danke Christian. Verbindung zum Server habe ich ja, nur das Statement (bei open) wird so wie es aussieht fortlaufend übertragen, wenn ich dem Monitortool glauben darf.

Hier mal die Ausgabe bis zum Open:
2013-04-05 20:41:50 cat: Connect, proto: FreeTDS_MsSQL>=2005, msg: CONNECT TO "BR60\SQLEXPRESS" AS USER "Bernd"
2013-04-05 20:41:50 cat: Connect, proto: FreeTDS_MsSQL>=2005, msg: USE TestDB
2013-04-05 20:41:50 cat: Connect, proto: FreeTDS_MsSQL>=2005, msg: set textlimit=2147483647
2013-04-05 20:41:51 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: set textsize 2147483647 set quoted_identifier on
2013-04-05 20:41:51 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: SET TRANSACTION ISOLATION LEVEL READ COMMITTED
2013-04-05 20:41:56 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: SELECT * FROM Person;

2013-04-05 20:41:56 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: exec sp_columns 'Person', null, null, null
2013-04-05 20:41:56 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: select c.colid, c.name, c.type, c.prec, c.scale, c.colstat, c.status, c.iscomputed from syscolumns c inner join sysobjects o on (o.id = c.id) where o.name = 'Person' and c.number=0 order by colid


... und danach kommt nur noch wiederholt das "SELECT * FROM Person" immer wieder....

Bernd.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Lazarus (und ZEOS) Neuling sucht DB-Anschluß

Beitrag von Christian »

Na vllt hast du ja auch ne Endlosschleife gebaut?
Ohne deinen Code kann man das schlecht beurteilen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

br60
Beiträge: 10
Registriert: Di 26. Mär 2013, 20:39

Re: Lazarus (und ZEOS) Neuling sucht DB-Anschluß

Beitrag von br60 »

... so gesehen, gibt es keinen weiteren Code. Lediglich drei Buttons, die connect, disconnect und open anstoßen. Wobei die Conection ja auch steht, nur eben bei Query.Open mit dem Statement "SELECT * FROM Person" dies zum Stillstand durch andauerndes Übertragen an die DB führt, wie das über SQLMonitor1LogTrace ausgegeben wird.

Was dann (hier die log.txt) so aussieht:
2013-04-05 22:05:34 cat: Connect, proto: FreeTDS_MsSQL>=2005, msg: CONNECT TO "BR60\SQLEXPRESS" AS USER "Bernd"
2013-04-05 22:05:34 cat: Connect, proto: FreeTDS_MsSQL>=2005, msg: USE TestDB
2013-04-05 22:05:34 cat: Connect, proto: FreeTDS_MsSQL>=2005, msg: set textlimit=2147483647
2013-04-05 22:05:34 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: set textsize 2147483647 set quoted_identifier on
2013-04-05 22:05:34 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: SET TRANSACTION ISOLATION LEVEL READ COMMITTED
2013-04-05 22:05:36 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: SELECT * FROM Person;

2013-04-05 22:05:36 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: exec sp_columns 'Person', null, null, null
2013-04-05 22:05:36 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: select c.colid, c.name, c.type, c.prec, c.scale, c.colstat, c.status, c.iscomputed from syscolumns c inner join sysobjects o on (o.id = c.id) where o.name = 'Person' and c.number=0 order by colid
2013-04-05 22:05:36 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: SELECT * FROM Person;

2013-04-05 22:05:36 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: SELECT * FROM Person;

2013-04-05 22:05:36 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: SELECT * FROM Person;

2013-04-05 22:05:36 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: SELECT * FROM Person;

2013-04-05 22:05:36 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: SELECT * FROM Person;

2013-04-05 22:05:36 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: SELECT * FROM Person;

2013-04-05 22:05:36 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: SELECT * FROM Person;

2013-04-05 22:05:36 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: SELECT * FROM Person;

2013-04-05 22:05:36 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: SELECT * FROM Person;

2013-04-05 22:05:36 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: SELECT * FROM Person;

2013-04-05 22:05:36 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: SELECT * FROM Person;

2013-04-05 22:05:36 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: SELECT * FROM Person;

2013-04-05 22:05:36 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: SELECT * FROM Person;

2013-04-05 22:05:36 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: SELECT * FROM Person;

usw...

Bernd.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Lazarus (und ZEOS) Neuling sucht DB-Anschluß

Beitrag von Christian »

Vllt liegts auch an der aktuellen zeos. Ich verwende immer eine etwas ältere Version da in der aktuellen immer irgendwo was nicht passt.
Ich hab privat aber keinen mssql Server verfügbar, ich installier mir mal ne express in ner vm und probiers mit meiner zeos.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

br60
Beiträge: 10
Registriert: Di 26. Mär 2013, 20:39

Re: Lazarus (und ZEOS) Neuling sucht DB-Anschluß

Beitrag von br60 »

.. das wäre super. Für heute muss ich sowieso abbrechen, muss morgen früh raus.

Danke.

Bernd.

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: Lazarus (und ZEOS) Neuling sucht DB-Anschluß

Beitrag von gocher »

Hallo Bernd,

ZEOS durchsucht wegen dem * im Select alle Spalten aus der Tabelle Person, dafür durchsucht Zeos die System-Tabellen mit dem SELECT c.colid, c.name, c.type, c.prec, c.scale, c.colstat, c.STATUS, c.iscomputed FROM syscolumns c INNER JOIN sysobjects o ON (o.id = c.id) WHERE o.name = 'Person' AND c.number=0 ORDER BY c.colid
in der Datei ZeosLib/src/dbc/ZDbcDbLibMetadata.pas Zeile:1884, 2706 und 2999
Überprüfe doch mal den geänderten Select, also mit c., in der SQL-Eingabe des MSSQL-Client, wenn er ohne nicht klappt brauchst Du nur die Datei korrigieren, bei mir klappt im MSSQL Server 2005 aber auch der Select ohne Tabellen-Angabe da die Spalte colid nur in syscolumns existiert.
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Lazarus (und ZEOS) Neuling sucht DB-Anschluß

Beitrag von hde »

ich arbeite z.Zt. mit Zeos 7.0.3-stable ohne jedes Problem, allerdings nicht mit msSQL. Habe it deshalb vorhin die Express-Version downgeloaded, aber sie lässt sich auf einer meiner Test-VMs so nicht installieren.

br60
Beiträge: 10
Registriert: Di 26. Mär 2013, 20:39

Re: Lazarus (und ZEOS) Neuling sucht DB-Anschluß

Beitrag von br60 »

@gocher
Vielen Dank für die Mühe. Habe das"c." dreimal korrigiert (die Zeilennummern sind bei mir anders) und neu compiliert. Leider keine Änderung:

2013-04-06 18:08:00 cat: Connect, proto: FreeTDS_MsSQL>=2005, msg: CONNECT TO "BR60\SQLEXPRESS" AS USER "Bernd"
2013-04-06 18:08:00 cat: Connect, proto: FreeTDS_MsSQL>=2005, msg: USE TestDB
2013-04-06 18:08:00 cat: Connect, proto: FreeTDS_MsSQL>=2005, msg: set textlimit=2147483647
2013-04-06 18:08:00 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: set textsize 2147483647 set quoted_identifier on
2013-04-06 18:08:00 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: SET TRANSACTION ISOLATION LEVEL READ COMMITTED
2013-04-06 18:08:02 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: SELECT * FROM Person;

2013-04-06 18:08:02 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: exec sp_columns 'Person', null, null, null
2013-04-06 18:08:02 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: select c.colid, c.name, c.type, c.prec, c.scale, c.colstat, c.status, c.iscomputed from syscolumns c inner join sysobjects o on (o.id = c.id) where o.name = 'Person' and c.number=0 order by c.colid
2013-04-06 18:08:02 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: SELECT * FROM Person;

2013-04-06 18:08:02 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: SELECT * FROM Person;

2013-04-06 18:08:02 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: SELECT * FROM Person;

2013-04-06 18:08:02 cat: Execute, proto: FreeTDS_MsSQL>=2005, msg: SELECT * FROM Person;
usw.

Habe auch probiert die Tabellenspalten aus der Tabelle Person explizit anzugeben, um damit den * zu vermeiden, leider auch kein Erfolg.

Bernd.

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: Lazarus (und ZEOS) Neuling sucht DB-Anschluß

Beitrag von gocher »

Da sich die Zeilennummern unterscheiden mal die Frage mit welcher Revision von ZeosLib versuchst Du den Zugriff?

Ich nutze Rev. 2212 letzte Änderung 22.März von http://svn.code.sf.net/p/zeoslib/code-0/trunk

Allerdings muss ich sagen MSSQL mit Zeos unter Lazarus ist meines Erachtens noch sehr buggy, es gibt Probleme mit UTF8 und Stored Procedures funktionieren noch überhaupt nicht, fraglich ist auch ob der SQL Server Express überhaupt funktioniert!

Versuche mal das folgende kurze Progrämmchen (es listet Deine Tabelle Person) es ist nur eine kurze Konsolenanwendung und braucht kein Zeos, aber damit schließt Du schon mal andere Probleme mit der Datenbank aus, natürlich musst Du Dein Passwort noch an der Stelle xxxx eingeben, sonst müsste alles passen!

Code: Alles auswählen

program Ole;
{$APPTYPE CONSOLE}
{$mode objfpc}{$H+}
uses Classes, SysUtils, ComObj, Variants;
 
function IIF(b: boolean; sTrue: string; sFalse: string = ''): string;
begin if b then result := sTrue else result := sFalse; end;
 
const
  adOpenForwardOnly = $00000000;
  adLockReadOnly = $00000001;
var
  cn, rs: OleVariant;
  i:integer;
  s: string;
begin
//connect db
  cn := CreateOleObject('ADODB.Connection');
// MSSQL 2005
  cn.Open('Provider=SQLOLEDB.1;Password=xxxx;User ID=Bernd;Initial Catalog=TestDB;Data Source=localhost;');
// oder MSSQL Express ?
// cn.Open('Data Source=localhost\SQLEXPRESS;Initial Catalog=TestDB;Integrated Security=False;User Id=Bernd;Password=xxxx;');
//select
  rs := CreateOleObject('ADODB.Recordset');
  rs.Open('SELECT * FROM Person', cn, adOpenForwardOnly, adLockReadOnly);
  s := '';
  //list fieldnames
  for i:=0 to rs.Fields.count-1 do
    s := s + IIF(i>0, ';') + rs.Fields[i].Name;
  s := s + #13#10;
  //list values
  while not rs.eof do
  begin
    for i:=0 to rs.Fields.count-1 do
      s := s + IIF(i>0, ';') + VarToStr(rs.Fields[i].Value);
    s := s + #13#10;
    rs.MoveNext;
  end;
  WriteLn(s);
  //close recordset
  rs.Close;
  rs := unassigned;
//close connection;
  cn.Close;
  cn := unassigned;
end.
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

br60
Beiträge: 10
Registriert: Di 26. Mär 2013, 20:39

Re: Lazarus (und ZEOS) Neuling sucht DB-Anschluß

Beitrag von br60 »

Hallo gocher,

mit diesem Connection-String:
cn.Open('Provider=SQLNCLI10.1;Password=xxxx;Persist Security Info=False;User ID=Bernd;Initial Catalog=TestDB;Data Source=BR60\SQLEXPRESS;')

funktioniert dein Progrämmchen. Die Daten werden angezeigt. Das Problem mit UTF8 ist mir bekannt, kann man aber lösen.

Danke nochmal für deine Mühe. Ich habe jetzt die letzte Revision 2218 in Verwendung.

Bernd.

Antworten