- 在线时间
- 0 小时
- 最后登录
- 2007-9-23
- 注册时间
- 2004-9-10
- 听众数
- 3
- 收听数
- 0
- 能力
- 0 分
- 体力
- 9975 点
- 威望
- 7 点
- 阅读权限
- 150
- 积分
- 4048
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1893
- 主题
- 823
- 精华
- 2
- 分享
- 0
- 好友
- 0

我的地盘我做主
该用户从未签到
 |
[摘自 水木清华站]
3 \. B, g. a- E2 Z$ S1 L7 E( S, n2 Q
* J9 ]- v# \+ W# a$ U
1 k+ {7 f* p* k7 V; p( t6 m对于SQL中的TEXT、IMAGE、MEMO字段的存取,可以采用下列程序:
5 ~0 q& I6 t5 g5 e2 L( v% P% Q+ ?9 MBLOB字段的读取:
i# ?: i* B5 ^. m0 o TBlobSTream* TemplateStream;
1 [. O7 F3 g- k' U3 S% D" N char* TempPlatePtr; W' w1 E& _2 Z) J7 u8 ^& y
, F& c! T7 U' G9 b( z' _3 U c- M9 \
TemplateStream=new TBlobStream((TBlobField*)WebQuery->FieldByName ' U6 k9 l5 t9 x3 m/ b- Y9 y
("SearchTem"),bmReadWrite); . M: v8 a9 w- o0 Z( `! A
TemplatePtr= new char[TemplateStream->Size];
4 d( t% `- g: j' c) Z TemplateStream->Read(TemplatePtr, TemplateStream->Size);
0 L5 t4 U E; }: G1 q. m# C ; j. ]7 N' [( f! n S7 ~7 W" d
BLOB字段的写入:
y8 o* g5 {9 F+ Y& \1 S TBlobSTream* TemplateStream; 8 h: l9 L# ]% c3 P- ~# L; W8 l
char* TempPlatePtr; ( _2 O9 @8 O+ T! k
+ @& m3 n$ b0 t2 \0 E4 U TemplateStream=new TBlobStream((TBlobField*)WebQuery->FieldByName 1 p: C. T( K. W/ P8 U
("SearchTem"),bmReadWrite);
+ s4 H4 o) h- N k+ W- n5 }# z& \ TemplatePtr= new char[TemplateStream->Size]; " P, _! t5 Z6 u/ D
TemplateStream->Write(TemplatePtr, TemplateStream->Size);
- s; }6 K$ l) m' k$ S, G + i# e& a; ]- ^7 z% p
________________________________________________________________ / l( B$ f9 t8 ?; t2 A/ d
补充: 3 P/ Q' V- G! i( o- C4 c
获得字段的大小用函数datalength , ~* n! u% z1 R6 c$ j8 I
7 H2 @+ Y- i! z: e* O8 p& g
SQL Server端要作一点设置:
* N! x0 V1 E% ZBy default, WRITETEXT is a nonlogged operation. This means that
; t0 x3 i6 C- r* O. P" ?2 {7 U& ztext or image data is not logged when it is written into the database. 6 H! W& O( O/ p7 Q9 ~5 e! z$ }
To use WRITETEXT in its default, nonlogged state, 5 D5 B* j- n( }, U2 _' w
//注意!! 8 P* y5 |) {2 ^$ Q& v0 J* p7 G
the system administrator must use the sp_dboption system stored - z( g) a$ W: i; o9 ]0 {' ?" J$ @. S
procedure to set select into/bulkcopy,
7 h' V" X7 B7 d& e) A5 q// ( m, F) F$ n2 \& t, g* m, C
which allows nonlogged data to be inserted.
: Z" b) A( r4 R4 k) Q
$ w' H7 a5 \5 W) u" p8 o. h/ Z6 k做了试验,直接写SQL语句好象不行. 6 }; A$ f- _/ P2 u
____________________________________________________________________
3 Y* H1 \; F* U7 T 一些注意事项和一个例子 " `" o5 K$ Q9 ?
在写入时: : ~9 m6 Y7 B& K3 _
(1)如果使用的是TTable,则要将其ReadOnly属性先置为false,然后调用Edit函数; 7 c C0 g! _4 }" W: D
(2)如果使用的是TQuery,则要将其RequestLive属性先置为true,然后调用Edit函数; . @# T7 d- O1 ~9 `& H) M# b
使得TTable(TQuery)是可写的. 6 h( C; {: w2 P7 x
) f5 t/ c0 I) z( n+ b下面是一个使用TQuery往content表(主键file_id)中插入一条记录的例子, ' U5 |9 m& C" ?) _7 e
script为一个BLOB字段: 7 ?+ l' F% ~, ?0 k" J5 @ _
TBlobStream *pScriptStream;
" w2 n5 |+ G' q9 t; L9 s$ K. j //插入一条记录
2 _' c0 B' v! N' G. J strSQL1="insert into content(file_id,script,key_image) values('";
, D& R( _, F; O* o: }4 o+ B strSQL1=strSQL1+m_szFileID+"',null,null)"; % d6 l q3 D# |$ P O
dmStoryEditor->qryExec->SQL->Clear();
8 R! T- z* ^- q7 `0 p6 R dmStoryEditor->qryExec->SQL->Add(strSQL1);
: T# f0 M' U& Y. v dmStoryEditor->qryExec->ExecSQL(); , @8 H1 J, z3 U! z0 S
dmStoryEditor->qryExec->Close(); 2 s; L& Y4 q4 d. }, J! n' e
//整理要写入的Blob数据
3 E5 C: q& v8 D" h+ b! }- Y LockMemories(NewsScript); 1 g4 l2 D( u! a
NewsScript.GetEdition(NewsScript.m_ScriptHead.byteEditionNum);
8 R% `8 T: z/ h NewsScript.m_pScript=(BYTE *)GlobalLock(NewsScript.m_hScript); + s- ]* G( T0 x# Y9 k9 n: a
if(NewsScript.m_pScript!=NULL) & y0 A4 }3 c A7 D2 O
{
: x3 _' s ^% v$ ?* O1 S: @ //再将刚插入的记录读出来,使该Query与该条记录关联 " l9 R1 U2 P F" ?
strSQL1="select file_id,script from content where file_id='"+ Z$ z3 ^' S, p" N, i
m_szFileID+"'";
! J# u5 C Z4 i( i# Z7 Q' V //允许该Query写 3 ~. @: r t0 i9 O7 k
dmStoryEditor->qryExec->RequestLive=true; # }8 R$ p6 v8 E& v2 Z" I" I
dmStoryEditor->qryExec->SQL->Clear(); % G: C( L* Z) F! c, S
dmStoryEditor->qryExec->SQL->Add(strSQL1);
. u$ e0 _" ?5 G" W dmStoryEditor->qryExec->Open(); ' g" u6 g0 s/ l8 P4 @: D
dmStoryEditor->qryExec->First(); 7 W; J. k; a- J) }* {% y9 ~, m
//将该Query置为可写
5 Y1 l. z' a0 J7 D3 o dmStoryEditor->qryExec->Edit();
0 x7 V2 P6 l9 ] pScriptStream=new TBlobStream((TBlobField*)dmStoryEditor->
/ T" _2 J9 k N. b" y: c6 Z ?; ] qryExec->FieldByName("script"),bmReadWrite); 5 e( L/ I( K6 @
pScriptStream->Write(NewsScript.m_pScript,
: `, p4 K0 D8 p7 ~% R- S( l5 y5 A- h NewsScript.m_lScriptRealSize);
) `( [/ \. [2 |. ]5 [ dmStoryEditor->qryExec-> ost(); $ v5 U. P1 _% p% C6 }+ V8 A1 `
dmStoryEditor->qryExec->RequestLive=false;
) { E) }& d# M delete pScriptStream; ! k& Z- _4 z% n1 ]. N
}
& ^) l( _( J x8 E+ K9 ?; E Y GlobalUnlock(NewsScript.m_hScript); * F- Z6 g( }4 N3 {% S6 R0 D
UnLockMemories(NewsScript); |
zan
|