2017-09-07 4 views
2

(ftBlob 필드에있는) ClientDataSet의 다른 레코드에 TBitmap 이미지의 배열을 추가하고 해당 레코드를 SQLite 데이터베이스에 저장하려고합니다. BLOB 필드 (DocImage)는 데이터베이스의 필수 필드입니다.SQLite 데이터베이스에서 BLOB 필드에 비트 맵을 저장하는 방법

그러나 내 코드는 비트 맵을 ClientDataSet의 blob 필드에 저장하지 않는 것 같습니다 ... 따라서 BdmMain.cdsTrxDoc.ApplyUpdates(0)을 호출하면 "DocImage '필드에 값이 있어야합니다."라는 오류가 발생합니다.

나는 전에 FTrxPhotoValue[i].SaveToStream(BlobStream)를 호출 한 후 내 BlobStream (BlobStream.Size)의 크기를 확인하고 그 크기가 증가 않지만, Blob 필드의 데이터 크기는 여기

0 코드의 조각입니다 남아 :

FTrxIDValue: Integer; 
FTrxDocIDValue: array of Integer; 
FTrxPhotoValue: array of TBitmap; 
// ... 
for i := 0 to Length(FTrxPhotoValue) do 
begin 
    BdmMain.cdsTrxDoc.Insert; 
    BdmMain.cdsTrxDoc['TrxID'] := FTrxIDValue; 
    BdmMain.cdsTrxDoc['DocID'] := FTrxDocIDValue[i]; 
    BlobField := BdmMain.cdsTrxDoc.FieldByName('DocImage'); 
    BlobStream := BdmMain.cdsTrxDoc.CreateBlobStream(BlobField, bmWrite); 
    FTrxPhotoValue[i].SaveToStream(BlobStream); 
end; 
// ... 
BdmMain.cdsTrxDoc.ApplyUpdates(0); 

답변

4

SaveToStream으로 전화 한 후 Free 스트림을 보내야합니다. 스트림은 Destroy 동안에 만 기본 필드를 업데이트합니다.

+0

SaveToStream 호출 후 BlobStream.Free를 추가했지만 이제는 액세스 위반 오류가 발생합니다 ... –

+0

전체 코드를 표시하고 액세스 위반이있는 행을 표시 할 수 있습니까? –

+4

'for i : = 0 to Length (FTrxPhotoValue) -1 do'을 반복하십시오. – Victoria