Ich sitze gerade vor einem vordergründig simplen Problem, nur komme ich beim besten Willen nicht auf eine Lösung bzw. die Ursache.
Ich greife mittels ZeosLib auf eine PostgreSQL-Datenbank zu. Dort habe ich eine Winz-Tabelle "test" angelegt, bestehend aus zwei Spalten:
- "test_id" vom Typ Serial (also ein auto-inkrementierender Integer) --> Primärschlüssel
- "kuerzel" vom Typ Character Varying(256)
Ich möchte einfach nur alle Datensätze der Tabelle abrufen (zwei sind vorhanden) und deren Primärschlüssel in einem dynamischen Integer-Array zwischenspeichern. Hier das kleine Testprogramm:
Delphi-Quellcode:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,
DB, ZAbstractRODataset, ZAbstractDataset, ZDataset,
ZConnection;
type
TForm1 =
class(TForm)
Button1: TButton;
ZConnection1: TZConnection;
Query: TZQuery;
procedure Button1Click(Sender: TObject);
private
FTerminartIds:
array of Integer;
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
Query.Close;
Query.SQL.Text := '
SELECT * ' +
'
FROM test;';
Query.Open;
SetLength(FTerminartIds,
Query.RecordCount);
if Query.FindFirst
then
begin
for i := 0
to (
Query.RecordCount - 1)
do
begin
FTerminartIds[i] :=
Query.DbcResultSet.GetIntByName('
test_id');
// Access Violation
Query.FindNext;
end;
end;
end;
Ich erhalte in der markierten Zeile immer eine
Access Violation und zwar berschachtelt in einer der Zeos-Units. Der Aufruf-Stack schaut in der Art aus:
Zitat:
--------------------------------------------------------------------------------------
|
Unit |Class |Procedure/Method |Line |
|-------------------------------------------------------------------------------------
|ZDbcCache.pas |TZRowAccessor |GetInt |1129[5]|
|ZDbcCache.pas |TZRowAccessor |GetInt |1124[0]|
|ZDbcCachedResultSet.pas |TZAbstractCachedResultSet|GetInt |828[1] |
|ZDbcResultSet.pas |TZAbstractResultSet |GetIntByName |1153[1]|
In der ZDbcCache.pas kracht es dann in der unten markierten zeile:
Delphi-Quellcode:
function TZRowAccessor.GetInt(ColumnIndex: Integer;
var IsNull: Boolean): Integer;
begin
{$IFNDEF DISABLE_CHECKING}
CheckColumnConvertion(ColumnIndex, stInteger);
{$ENDIF}
Result := 0;
if FBuffer.Columns[FColumnOffsets[ColumnIndex - 1]] = 0
then // Access Violation
begin
case FColumnTypes[ColumnIndex - 1]
of
stBoolean:
if GetBoolean(ColumnIndex, IsNull)
then
Result := 1
else Result := 0;
stByte: Result := GetByte(ColumnIndex, IsNull);
stShort: Result := GetShort(ColumnIndex, IsNull);
stInteger:
Result := PInteger(@FBuffer.Columns[FColumnOffsets[ColumnIndex - 1] + 1])^;
stLong: Result := GetLong(ColumnIndex, IsNull);
stFloat: Result := Trunc(GetFloat(ColumnIndex, IsNull));
stDouble: Result := Trunc(GetDouble(ColumnIndex, IsNull));
stBigDecimal: Result := Trunc(GetBigDecimal(ColumnIndex, IsNull));
stString, stUnicodeString:
Result := StrToIntDef(GetString(ColumnIndex, IsNull), 0);
end;
IsNull := False;
end else
IsNull := True;
end;
Irgendjemand eine Idee? Kann eigentlich nicht so schwer sein, aber ich komm echt nicht drauf