BLOBs und TQuery
-
Hallo,
ich würde gerne wissen, wie ich aus aus meinem TQuery Blob-Felder auslesen kann.
Zu der Methode GetBlobFieldData(int FieldNo, TBlobByteData &Buffer); habe ich leider nur Delphizeugs gefunden, was mir nicht wirklich weiterhilft!
In dem BlobFeld ist Text enthalten und ich möchte nun an den Text kommen.
vielen Dank
Saxony
-
Hiho,
so ich habe nun folgendes versucht:
Query2->Open(); Query2->First(); while(!Query2->Eof) { if (Query2->FieldByName("MESSAGETEXT")->IsBlob()) { TMemoField *field = new TMemoField(Query2->FieldByName("MESSAGETEXT")); if (field != NULL) { ShowMessage(field->AsString); } Query2->Next(); Helper::doExport(Edit1->Text); } } Query2->Close();
Aber immer wenn ich mit field->AsString darauf zugreifen will, gibt es eine Access Violation at address ....
Hmm weiß da jemand weiter?
bye Saxony
-
Mach doch eine Debug und schaue was drin ist.
BLOB sind eigentlich Bytes und kein String.
Warum speicherst Du eine Text als BLOB?
-
Unix-Tom schrieb:
Mach doch eine Debug und schaue was drin ist.
BLOB sind eigentlich Bytes und kein String.
Warum speicherst Du eine Text als BLOB?Hiho,
also Debug geht nicht, da ich auf meinem Rechner entwickle aber per RemoteDesktop auf nem anderen Server das Programm ausführen muss.
Das Feld selber ist ein CLOB um genau zu sein.
Ich speicher das ja nicht als Text, sondern eine andere Anwendung. Ich wills nur mal wieder rauslesen
bye Saxony
-
Schau mal in der BCB-Hilfe unter TBlobStream.
-
So Freunde,
also in einem chinesischen Forum habe ich folgendes gefunden:
TStringStream *Stream = new TStringStream(""); ((TMemoField *)Query2->FieldByName("MESSAGETEXT"))->SaveToStream(Stream); Stream->Seek(0, soFromBeginning); if (Stream->Size > 0) Memo2->Lines->LoadFromStream(Stream); else Memo2->Lines->Append("nix"); delete Stream;
Ich denke TBlobStream kapselt oben genanntes nur!
Nunja nichts destotrotz habe ich das trotzdem mal mit TBlobStream versucht:TBlobStream *Stream = Query2->CreateBlobStream(Query2->FieldByName("MESSAGETEXT"), bmReadWrite); if (Stream->Size > 0) Memo2->Lines->LoadFromStream(Stream); else Memo2->Lines->Append("nix"); delete Stream;
Lustigerweise kommt gleich bei der ersten Zeile folgender Fehler:
BCB schrieb:
Cannot convert "TStream*" to "TBlobStream*"
Aber das Interesaante dabei ist, dass dies genau so in der BCB Hilfe als Beispiel steht
Wo ist da nun der Fehler? Es muss doch möglich sein, mit einem TQuery mal ein CLOB Feld auszulesen um es in ein Memo zu klatschen. Ach man!
bye Saxony
-
Saxony schrieb:
Lustigerweise kommt gleich bei der ersten Zeile folgender Fehler:
BCB schrieb:
Cannot convert "TStream*" to "TBlobStream*"
Aber das Interesaante dabei ist, dass dies genau so in der BCB Hilfe als Beispiel steht
Nö, steht so nicht im Beispiel. Im Beispiel steht TStream*. CreateBlobStream liefert einen TStream.
Das Problem dürfte sein, dass nach dem Einlesen des Streams, der interne Zeiger am Ende des Streams steht. Diesen musst Du 'von Hand' auf die Stelle setzen, ab der Du auf die Daten zugreifen willst:
TStream::Position = 0;
-
Naja zugreifen kann ich ja noch nicht, da ich ja über den Compilerfehler gar nicht hinweg komme.
Bei mir steht in der Hilfe folgendes:
The following example deletes the stream from position 60 within the blob stream to the end. void __fastcall TForm1::Button1Click(TObject *Sender) { TBlobStream *Stream1 = Table1.CreateBlobStream(Table1->FieldByName("Notes", bmReadWrite); try { Table1->Edit(); if (Table1->State == dsEdit) { Stream1->Seek(60, 0); // Move to byte #60 Stream1->Truncate(); /* Delete from current position (60) to end of stream. */ Table1->Post(); } } __finally { delete Stream1; } }
Aber das funktioniert mit einem Query aber nicht, obwohl CreateBlobStream von TBDEDataSet geerbt wird und somit auch für TQuery zu verfügung stehen müsste.
bye Saxony
-
So hat sich alles aufgeklärt! Nun funktioniert es!
Man sollte auch sicherstellen, dass in den auszulesenden CLOB Feldern, auch wirklich Texte enthalten sind!
bye Saxony