📄 step6.cpp
字号:
#include <stdio.h> // for printf#include <SQLAPI.h> // main SQLAPI++ header// forwardsvoid IntoFileReader( SAPieceType_t ePieceType, void *pBuf, unsigned int nLen, unsigned int nBlobSize, void *pAddlData);int main(int argc, char* argv[]){ SAConnection con; // connection object SACommand cmd( &con, "Select fblob from test_tbl"); // command object try { // connect to database (Oracle in our example) con.Connect("test", "tester", "tester", SA_Oracle_Client); // Usage 1. Read whole BLob(s) into internal buffers // Select BLob from our test table cmd.Execute(); // fetch results row by row and print results while(cmd.FetchNext()) { // after fetching a row all Long/Lob fields are automatically read into internal buffers // just like other data types SAString s = cmd.Field("fblob").asBLob(); printf("Size of BLob is %d bytes\n", s.GetLength()); } // Usage 2. Read BLob in pieces providing user callback for BLob data processing // Select blob from our test table cmd.Execute(); // do not automatically read this field into internal buffer (into corresponding SAField object) // we will provide a callback for BLob fetching after FetchNext cmd.Field("fblob").setLongOrLobReaderMode(SA_LongOrLobReaderManual); // fetch results row by row and print results SAString sFilename; int i = 0; while(cmd.FetchNext()) { sFilename.Format("fblob%d.bin", ++i); // at that moment all fields are fetched except // those that set for manual retrieving // read them (fblob in our example) now if(!cmd.Field("fblob").isNull()) cmd.Field("fblob").ReadLongOrLob( IntoFileReader, // our callback to read BLob content into file 10*1024, // our desired piece size (void*)(const char*)sFilename // additional data, filename in our example ); } // commit changes on success con.Commit(); printf("Rows with BLob field fetched!\n"); } catch(SAException &x) { // SAConnection::Rollback() // can also throw an exception // (if a network error for example), // we will be ready try { // on error rollback changes con.Rollback(); } catch(SAException &) { } // print error message printf("%s\n", (const char*)x.ErrText()); } return 0;}static FILE *pFile = NULL;static int nTotalRead;void IntoFileReader( SAPieceType_t ePieceType, void *pBuf, unsigned int nLen, unsigned int nBlobSize, void *pAddlData){ if(ePieceType == SA_FirstPiece || ePieceType == SA_OnePiece) { nTotalRead = 0; const char *sFilename = (const char *)pAddlData; pFile = fopen(sFilename, "wb"); if(!pFile) SAException::throwUserException(-1, "Can not open file '%s' for writing", sFilename); } fwrite(pBuf, 1, nLen, pFile); nTotalRead += nLen; // show progress printf("%d bytes of %d read\n", nTotalRead, nBlobSize); if(ePieceType == SA_LastPiece || ePieceType == SA_OnePiece) { fclose(pFile); pFile = NULL; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -