2012/11/26

C++ Builder的TDataSet存取Text、Image及Memo欄位的方式

对于SQL中的TEXT、IMAGE、MEMO字段的存取,可以采用下列程序:

/* BLOB字段的读取: */
TBlobSTream* TemplateStream;
char* TempPlatePtr;              

TemplateStream = new TBlobStream((TBlobField*)WebQuery->FieldByName("SearchTem"),bmReadWrite);
TemplatePtr = new char[TemplateStream->Size];
TemplateStream->Read(TemplatePtr, TemplateStream->Size);


/* BLOB字段的写入:*/
TBlobSTream* TemplateStream;
char* TempPlatePtr;              

TemplateStream = new TBlobStream((TBlobField*)WebQuery->FieldByName("SearchTem"),bmReadWrite);
TemplatePtr = new char[TemplateStream->Size];
TemplateStream->Write(TemplatePtr, TemplateStream->Size);

________________________________________________________________
补充:
获得字段的大小用函数datalength

SQL Server端要作一点设置:
By default, writetext is a non-logged operation. This means that text or image data is not logged when it is written into the database. To use writetext in its default, nonlogged state,
//注意!!
the system administrator must use the sp_dboption system stored
procedure to set select into/bulkcopy,
//
which allows nonlogged data to be inserted.

做了试验,直接写SQL语句好象不行.
____________________________________________________________________
一些注意事项和一个例子
在写入时:
(1)如果使用的是TTable,则要将其ReadOnly属性先置为false,然后调用Edit函数;
(2)如果使用的是TQuery,则要将其RequestLive属性先置为true,然后调用Edit函数;
使得TTable(TQuery)是可写的.

下面是一个使用TQuery往content表(主键file_id)中插入一条记录的例子,script为一个BLOB字段:
TBlobStream *pScriptStream;

//插入一条记录
strSQL1 = "INSERT INTO content(file_id, script, key_image) values (:FileID, NULL, NULL) ";
dmStoryEditor->qryExec->SQL->Clear();
dmStoryEditor->qryExec->SQL->Text = strSQL1;
dmStoryEditor->qryExec->Params->ParamByName('FileID').AsString = m_szFileID;
dmStoryEditor->qryExec->ExecSQL();

//整理要写入的Blob数据   
LockMemories(NewsScript);
NewsScript.GetEdition(NewsScript.m_ScriptHead.byteEditionNum);
NewsScript.m_pScript = (BYTE *)GlobalLock(NewsScript.m_hScript);

if(NewsScript.m_pScript != NULL)
{
  //再将刚插入的记录读出来,使该Query与该条记录关联
  strSQL1 = "SELECT file_id, script FROM content WHERE file_id = :file_id ";
  //允许该Query写
  dmStoryEditor->qryExec->RequestLive = true;
  dmStoryEditor->qryExec->SQL->Clear();
  dmStoryEditor->qryExec->Params->ParamByName('FileID').AsString = m_szFileID;
  dmStoryEditor->qryExec->Open();
  dmStoryEditor->qryExec->First();
  //将该Query置为可写
  dmStoryEditor->qryExec->Edit();
  pScriptStream = new TBlobStream((TBlobField*)dmStoryEditor->qryExec->FieldByName("script"),bmReadWrite);
  pScriptStream->Write(NewsScript.m_pScript, NewsScript.m_lScriptRealSize);
  dmStoryEditor->qryExec->Post();
  dmStoryEditor->qryExec->RequestLive = false;
  delete pScriptStream;
}
GlobalUnlock(NewsScript.m_hScript);
UnLockMemories(NewsScript);

參考資料:

沒有留言:

張貼留言