Binärdaten in File schreiben...
-
Hi,
also ich hole mir per Stored Procedure Binärdaten für 3 Bitmaps aus der Datenbank und will dann daraus die Files schreiben. Die Größe des erzeugten Files passt, aber Win sagt mir, dass die Datei möglicherweise beschädigt ist.
Meine Vorgehensweise (die SQL-Aufrufe sind aus einer DLL):CByteArray PictN, PictP, PictS; PictN.SetSize(nImgSize); SqlStmt.BindCol(3, SQL_C_CHAR, PictN.GetData(), nImgSize, &cbRet); while (SqlStmt.FetchWithCheck(__FILE__, __LINE__)) { CFile file("D:\\PictN.bmp", CFile::modeCreate | CFile::modeWrite | CFile::typeBinary); file.Write(PictN.GetData(), nImgSize); file.Close(); ...
Die Daten liegen korrekt in dem Byte-Array vor und haben auch die vorgegebene Größe (wird von der SP ebenfalls zurückgegeben).
Was mache ich noch falsch bzw. wie macht man sowas sonst ??
Wer kann mir helfen... ??
-
So wie ich das sehe schreibst Du auch genau die daten in die Datei.
Müsstest Du doch mit einem Hex-Editor vergleichen können.
An dem Stück Code liegt es nicht.
-
Hm, also die Dateien sind tatsächlich laut Hex-Editor an einigen Stellen unterschiedlich.
Kann das nicht verstehen.Das Byte-Array ist auf jeden Fall genauso groß wie die Daten. Also die Größe stimmt.
Mit .NET hatte ich genau dieselbe Stored Procedure genutzt und da hat das Schreiben des Bitmaps funktioniert.
Der Code dafür sah so aus, nur mal als Ergänzung (die Größe des Byte-Arrays ist auch dieselbe):while (reader.Read()) { object[] temp = new object[reader.VisibleFieldCount]; reader.GetValues(temp); using (BinaryWriter writer = new BinaryWriter(File.Create("D:\\PictN.bmp"))) writer.Write((byte[])values[2]); ...
Oder liegt das vielleicht doch am CByteArray ?? (Wenn ja, wie kann ich denn das noch lösen ??)
Kanns mir aber nicht vorstellen...EDIT: Und die fixe Größe des Bitmaps (was ich mir aus der DB hole) ist immer 377912 Bytes.
Auch mit einem simplen byte-Array ändert sich nix.Ich verstehe es einfach nicht...
-
Hi, also das Rätsel ist gelöst. War auch eig. nicht schwer, wenn mans denn einmal weiß...
if (SqlStmt.ExecWithCheck(__FILE__, __LINE__)) { if (SqlStmt.FetchWithCheck(__FILE__, __LINE__)) { TCHAR szFilePath[MAX_PATH]; byte *pBuffer = new byte[nImgSize]; SqlStmt.GetData(3, pBuffer, nImgSize, cbRet); sprintf_s(szFilePath, MAX_PATH, "%s%s.PictN.bmp", szPath, strKeybLang); CFile fileN(szFilePath, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary); fileN.Write(pBuffer, nImgSize); fileN.Close(); ...
Durch die Angabe von SQL_C_CHAR in SQLBindCol wurde natürlich am Ende nur Text geschrieben. Entweder die Angabe von SQL_C_BINARY in SQLBindCol oder wie hier im Bsp. funktioniert es dann !
Aber trotzdem für deine Hilfe Martin !