Einzelnen Beitrag anzeigen

MatthiasR

Registriert seit: 21. Apr 2005
193 Beiträge
 
#1

ZeosLib: ständig Access-Viol. bei GetIntByName & Serial-

  Alt 29. Jun 2009, 08:36
Datenbank: PostgreSQL • Version: 8.3 • Zugriff über: ZeosLib
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
  Mit Zitat antworten Zitat