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

我的地盘我做主
该用户从未签到
 |
[摘自 水木清华站]
1 Z9 o: h5 m5 w% i: F6 H" _0 T
" t3 a8 c, s6 E
7 ?& |" U( t' E( t5 P% g, l对于SQL中的TEXT、IMAGE、MEMO字段的存取,可以采用下列程序:
- r$ P' F: `: t8 ]% vBLOB字段的读取: 8 {+ h3 X! O+ a: m. t+ a* [$ S
TBlobSTream* TemplateStream;
/ J4 C! ]) ^3 J$ s char* TempPlatePtr;
; C3 ^9 n+ b/ }* R {: Y j. i$ D2 u8 [ K c: q$ d0 i
TemplateStream=new TBlobStream((TBlobField*)WebQuery->FieldByName 2 y6 y( S. ^1 N' `* _; F$ Y
("SearchTem"),bmReadWrite);
# N' h" I. z6 D$ K' E+ J3 t) x TemplatePtr= new char[TemplateStream->Size]; 1 F. n! x* T! X/ ^/ @
TemplateStream->Read(TemplatePtr, TemplateStream->Size); ! b6 ^( Z3 Z, r: y( Z
& \. S0 G/ u: h0 n3 H! L aBLOB字段的写入:
1 m4 Y4 s6 Q: S TBlobSTream* TemplateStream; % t. @* C# t0 @; h
char* TempPlatePtr; 7 g- s7 X! a+ K. K' w6 \6 Q- q
7 e" s3 @ }/ J TemplateStream=new TBlobStream((TBlobField*)WebQuery->FieldByName
7 @ [. R# h- ?* |0 L ("SearchTem"),bmReadWrite); 4 _" v) z1 F5 ~
TemplatePtr= new char[TemplateStream->Size];
$ q6 K8 I7 g8 X1 o TemplateStream->Write(TemplatePtr, TemplateStream->Size);
$ Z8 o, n) m5 B # A8 b. h, j$ e+ L9 g: E
________________________________________________________________
" t! R8 d- B" W) _/ @0 B8 i补充: $ W+ M' {" s! d, y2 v& r* C1 Z
获得字段的大小用函数datalength
2 K7 \# d7 Q0 F9 o 3 ~& M; V' ?% J* f" z7 A
SQL Server端要作一点设置:
, g4 _* i3 f! O* G( S3 XBy default, WRITETEXT is a nonlogged operation. This means that
! ^5 ?0 {6 Z$ j! e/ |! W# H) {text or image data is not logged when it is written into the database. 1 K. X. {/ q4 w* P
To use WRITETEXT in its default, nonlogged state,
) {1 q8 j9 l" A/ A//注意!! ) `6 K: }8 E4 C6 B+ O7 M/ o- s$ T
the system administrator must use the sp_dboption system stored
9 ~ n: H9 h5 q. `" xprocedure to set select into/bulkcopy, : Y& ?" G# B4 z- [
//
/ a( P' i6 ]4 {* a. [" l% w; lwhich allows nonlogged data to be inserted.
2 \0 w7 W. g- A6 b$ h 0 X8 Y4 c4 L$ Y, y9 E
做了试验,直接写SQL语句好象不行. - p# w4 Z5 n% O5 e
____________________________________________________________________
% V" m( e( ]7 E6 u( ~1 ]% z) f 一些注意事项和一个例子 0 H8 b" |# w# W: X
在写入时: 3 |7 H' P5 P. s: V2 C! H% L- U
(1)如果使用的是TTable,则要将其ReadOnly属性先置为false,然后调用Edit函数;
% ~, f+ m8 l8 U- A3 u. W0 X(2)如果使用的是TQuery,则要将其RequestLive属性先置为true,然后调用Edit函数; , e4 P( X5 t" ^+ M) l
使得TTable(TQuery)是可写的.
: f/ _# [8 I* P$ c `6 l- U
$ v! o* a Y3 |+ S8 o下面是一个使用TQuery往content表(主键file_id)中插入一条记录的例子,
& x2 Q7 b+ b6 m5 |7 `# ~script为一个BLOB字段:
% E; \) p& A" [, ~6 D/ n; X TBlobStream *pScriptStream;
6 ?7 X6 L/ m, z8 H# n3 I+ q //插入一条记录 : `6 N# W! O3 H$ Q
strSQL1="insert into content(file_id,script,key_image) values('";
2 l+ W+ b2 z p5 X. F3 [ strSQL1=strSQL1+m_szFileID+"',null,null)";
" c4 k. \2 n: M7 `* a dmStoryEditor->qryExec->SQL->Clear();
( \# M5 ]& k5 G dmStoryEditor->qryExec->SQL->Add(strSQL1); ' ?# E$ b( O* M; F( y6 o
dmStoryEditor->qryExec->ExecSQL(); / a) H4 L: b" e" u
dmStoryEditor->qryExec->Close(); . ]$ h) |# U; A6 Z3 x& O* W! G
//整理要写入的Blob数据 # ?8 ~6 e9 v$ [1 ]2 J9 _
LockMemories(NewsScript); ' ~9 W# S: }" J0 `( W
NewsScript.GetEdition(NewsScript.m_ScriptHead.byteEditionNum); 6 ~# b3 H: I6 y* y" e, ^6 b
NewsScript.m_pScript=(BYTE *)GlobalLock(NewsScript.m_hScript);
3 u. N6 R4 ?( S/ h: M8 p5 | if(NewsScript.m_pScript!=NULL) * ]( k: O) B7 |: q3 ?0 t
{ % h/ C; c; q# j3 g- x: _" y; D8 [
//再将刚插入的记录读出来,使该Query与该条记录关联
' U @* M! o, u. j, {" R3 u5 N strSQL1="select file_id,script from content where file_id='"+ " f. V+ o$ }7 q1 n5 q4 I
m_szFileID+"'";
4 @/ l6 x" q# v" t& r1 F //允许该Query写 ( w, g2 [: {: q9 j: Q
dmStoryEditor->qryExec->RequestLive=true;
3 f* |3 V$ V/ |, \' d dmStoryEditor->qryExec->SQL->Clear();
{; |. X. h- f dmStoryEditor->qryExec->SQL->Add(strSQL1);
1 T. E! l+ \: A; y1 _ dmStoryEditor->qryExec->Open(); 5 P4 w6 q' ~0 S
dmStoryEditor->qryExec->First();
& i g! |8 V4 W* T6 l //将该Query置为可写 + g' H, U7 g5 u# M" v
dmStoryEditor->qryExec->Edit();
& q4 T* g* E7 n. i4 C/ a pScriptStream=new TBlobStream((TBlobField*)dmStoryEditor-> & g! ~5 G$ k" V5 T! ~# s" l
qryExec->FieldByName("script"),bmReadWrite); 0 `2 i! n. h+ @, W' R ?6 {
pScriptStream->Write(NewsScript.m_pScript, 3 X/ [& c# |* p" }/ v
NewsScript.m_lScriptRealSize); 9 u! ~# |& c' R# _
dmStoryEditor->qryExec-> ost(); % X1 j# w6 o' T0 l5 P" w# I
dmStoryEditor->qryExec->RequestLive=false;
. u/ d) i B6 ^ delete pScriptStream;
4 }# P) u7 A, g& O' v( q3 E! u* E9 F } : ~) `( p! L7 P2 t
GlobalUnlock(NewsScript.m_hScript);
( v7 n }, x; j UnLockMemories(NewsScript); |
zan
|