标题: 在 C++Builder 中,如何自定义属性 [properties] ? [打印本页] 作者: 韩冰 时间: 2005-1-26 12:32 标题: 在 C++Builder 中,如何自定义属性 [properties] ? [摘自 水木清华站]( o. k v& A& T9 o3 m
0 A2 l1 C' j. @/ o. |' h: J- |# }
& l* i& j9 S, [ `
对于SQL中的TEXT、IMAGE、MEMO字段的存取,可以采用下列程序: 2 ` _; h( p7 v3 p& u5 @BLOB字段的读取: 2 e( H9 w& a" U, G0 ` TBlobSTream* TemplateStream; + I% N7 d; _/ b2 W2 y6 a, u) } char* TempPlatePtr; + }2 Y/ I* W4 I' \& m l' Y3 @
1 R7 x t$ y" K& e- n9 V
TemplateStream=new TBlobStream((TBlobField*)WebQuery->FieldByName 7 @- Q$ s# R6 U( e/ Z. l* A
("SearchTem"),bmReadWrite); * B$ k- x: H: S j% o/ L& a- N+ |
TemplatePtr= new char[TemplateStream->Size]; 6 z8 Q/ H8 f B/ P9 G" Q9 H TemplateStream->Read(TemplatePtr, TemplateStream->Size); ' r; e8 x' L3 U8 i- R, O , u1 N4 J8 P# ?& SBLOB字段的写入: 4 y& z9 k7 J8 o; W: }
TBlobSTream* TemplateStream; ! l. K3 r3 D. {9 T6 T: Q& i. T char* TempPlatePtr; 5 c9 y3 m/ l8 X/ [4 m
: @3 B# q3 i, I, y/ }5 |
TemplateStream=new TBlobStream((TBlobField*)WebQuery->FieldByName * c9 J' \1 G% i ("SearchTem"),bmReadWrite); * o+ R1 }$ w* N* o/ N/ O
TemplatePtr= new char[TemplateStream->Size]; 4 Q6 ]: |: f, m. _, r TemplateStream->Write(TemplatePtr, TemplateStream->Size); & Q3 Q2 x% t2 l
. T9 c. K+ q$ C5 l1 G* c3 N
________________________________________________________________ ; p) | Q% v j9 F% C6 S S' [补充: 6 q% u# A% Y2 l2 ~
获得字段的大小用函数datalength 8 a$ O( d8 L# q& k" y
/ M1 j0 D( h2 n' z' hSQL Server端要作一点设置: + X h: p- \. q T) @
By default, WRITETEXT is a nonlogged operation. This means that 7 j( S; Y6 K/ x3 `6 n7 ^9 V; P4 I, Dtext or image data is not logged when it is written into the database. 1 m0 D: C' ]! |) r# G0 JTo use WRITETEXT in its default, nonlogged state, 6 n7 ^6 v1 X( F0 C: V0 o
//注意!! - ^0 |& m; E, F3 {% H" Y8 ]
the system administrator must use the sp_dboption system stored + Z, f# G5 X Y K5 k) {
procedure to set select into/bulkcopy, ! e0 I V" C( j ^" g4 _
// # K* c: L u7 W
which allows nonlogged data to be inserted. m# `4 R6 z* V! E# c
4 j3 Z* { v1 Q7 M
做了试验,直接写SQL语句好象不行. . T U% y+ G- ` F; K- `____________________________________________________________________ 6 `; {+ r! B, L" r3 l 一些注意事项和一个例子 5 R+ A/ S o* n( n# z i! s! g7 t在写入时: % P D# t, i. n* q
(1)如果使用的是TTable,则要将其ReadOnly属性先置为false,然后调用Edit函数; & M* \7 Q7 X6 G# t4 C4 n
(2)如果使用的是TQuery,则要将其RequestLive属性先置为true,然后调用Edit函数; 1 Y; [$ d$ o" X" l7 J; R使得TTable(TQuery)是可写的. . f: O5 [$ N9 }9 ^* j) }" B8 y
* }, ]" K) k$ H, \下面是一个使用TQuery往content表(主键file_id)中插入一条记录的例子, 0 }7 t# |' C$ K* O0 G, {
script为一个BLOB字段: ( N" Y$ A6 W* N# n( N( u7 n v TBlobStream *pScriptStream; ' \; v7 \- q7 |% O% ?5 y5 @4 n, I //插入一条记录 . i* s/ {% w/ j- D5 f; J: A# M strSQL1="insert into content(file_id,script,key_image) values('"; % T! V% m# L: X+ o- c! d7 V6 J
strSQL1=strSQL1+m_szFileID+"',null,null)"; 9 G% ~: I8 ]5 u
dmStoryEditor->qryExec->SQL->Clear(); . x- y- |* ]& B# E dmStoryEditor->qryExec->SQL->Add(strSQL1); 1 E0 E' l. b' k5 z dmStoryEditor->qryExec->ExecSQL(); $ x6 @8 u" ]6 G0 Q, }. _2 K
dmStoryEditor->qryExec->Close(); " L7 o2 f( g/ x, Q6 @: y
//整理要写入的Blob数据 ! A+ b8 g7 F; j" v9 X LockMemories(NewsScript); ; c: ^) t8 O9 i3 e% J
NewsScript.GetEdition(NewsScript.m_ScriptHead.byteEditionNum); 5 E% q& v- q! m NewsScript.m_pScript=(BYTE *)GlobalLock(NewsScript.m_hScript); $ S$ ~7 {* E) F if(NewsScript.m_pScript!=NULL) g" W, X5 C4 H m+ Y
{ ( U* Y% a% V7 V( ? //再将刚插入的记录读出来,使该Query与该条记录关联 1 F9 k9 q( f* j& y( t
strSQL1="select file_id,script from content where file_id='"+ 0 c6 ?2 Q& U3 w9 e m_szFileID+"'"; + w4 g* u& |: E! C //允许该Query写 8 _5 c; d* w9 x {$ ^# I
dmStoryEditor->qryExec->RequestLive=true; ' }3 ]2 ]: w- l2 Q) q& v6 q
dmStoryEditor->qryExec->SQL->Clear(); " @% t* ]5 z) w dmStoryEditor->qryExec->SQL->Add(strSQL1); ' n |+ d* J9 Q' Q. V% Y* @3 Y: N dmStoryEditor->qryExec->Open(); ' i9 R) y3 w3 |( c+ Q( o
dmStoryEditor->qryExec->First(); - A+ w# v N0 ?1 E8 |& I
//将该Query置为可写 - @7 t8 j, H/ V9 i. C& Y% V& U dmStoryEditor->qryExec->Edit(); 1 x* V; u- x1 o2 j- C pScriptStream=new TBlobStream((TBlobField*)dmStoryEditor-> 7 v' d X& K- m/ u. q' ?# ` qryExec->FieldByName("script"),bmReadWrite); : E' u [+ N7 A* w) y: k/ i
pScriptStream->Write(NewsScript.m_pScript, 6 y2 p7 u# E% S
NewsScript.m_lScriptRealSize); 1 Y2 o" Y5 h( A8 s5 X3 Q dmStoryEditor->qryExec->ost(); 9 C# o; Y$ x" G- I
dmStoryEditor->qryExec->RequestLive=false; 7 |0 w, W8 j% w delete pScriptStream; 6 M% ^) U; F: s+ N2 s* X* d' e% ]
} : b! M9 F; C; {# m GlobalUnlock(NewsScript.m_hScript); 6 P/ H$ A* R, L+ H) Y/ x UnLockMemories(NewsScript);