Zitat von
Dax:
Vorweg: natürlich kann ich mich hinsichtlich der APIs irren, aber ich glaube, dass Read und Write Parameter (Pointer,Länge) hatten
Ich bezweifle aber stark, dass es an der Methode liegt. Tritt das Problem denn immer auf, oder erst ab einer gewissen Tagmenge?
Hi,
ja, das Verhalten tritt immer auf.
So schreibe ich die Knoten und die dazugehörigen Tags in die Datenbank:
Delphi-Quellcode:
procedure TORPDataBase.WriteNodeToDB(Node: TORPNode);
var
Blob: TMemoryStream;
begin
Blob := TMemoryStream.Create;
Blob.Seek(0,soFromBeginning);
try
DecimalSeparator := '.';
with fInsertNodeQuery do
begin
Connection := fConnection;
ParamCheck := true;
WriteTags(Node.tags, Blob);
Params.CreateParam(ftBlob, 'tags', ptInput);
ParamByName('tags').LoadfromStream(Blob, ftBlob);
ParamByName('lon').AsFloat := StrToFloat(Node.Lon);
ParamByName('lat').AsFloat := StrToFloat(Node.Lat);
ParamByName('node_id').AsInteger := StrToInt(Node.ID);
ExecSQL;
end;
finally
FreeAndNil(Blob);
end;
end;
Und so lese ich sie wieder aus:
Delphi-Quellcode:
function TORPDataBase.ReadNodesFromDB(): TORPNodes;
var
BlobStream: TStream;
Blob: TMemoryStream;
fSelectNodeQuery: TZQuery;
i: integer;
begin
try
DecimalSeparator := '
.';
fSelectNodeQuery := TZQuery.Create(
nil);
with fSelectNodeQuery
do
begin
Connection := fConnection;
ParamCheck := true;
SQL.Text := '
SELECT * FROM NODES';
Open;
While not fSelectNodeQuery.Eof
do
begin
Blob := TMemoryStream.Create;
Blob.Seek(0,soFromBeginning);
SetLength(Result,Length(Result)+1);
i := High(Result);
Result[i].ID := FieldByName('
ID').AsString;
Result[i].Lat := FieldByName('
Lat').AsString;
Result[i].Lon := FieldByName('
Lon').AsString;
BlobStream := CreateBlobStream(FieldByName('
Tags'),bmRead);
try
Blob.CopyFrom(BlobStream, 0);
finally
FreeAndNil(BlobStream);
end;
Result[i].Tags := ReadTags(Blob);
fSelectNodeQuery.Next;
end;
end;
finally
FreeAndNil(Blob);
end;
end;
Jede wette, da steckt nur irgendein kleiner dämlicher Fehler drin?
Ich hatte tatsächlich die Tags vergessen? Oh man..