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

我的地盘我做主
该用户从未签到
 |
[摘自 水木清华站]# j& ~8 T2 v F7 E% B
& P) I5 h3 ^; F6 y. Y
3 x9 U- e, x# N对于SQL中的TEXT、IMAGE、MEMO字段的存取,可以采用下列程序:
6 e: @& F4 p6 q4 M- iBLOB字段的读取:
3 K) C3 B) ?% U9 O* t# ^ TBlobSTream* TemplateStream; + g- k; n1 s! ?9 L4 s( b( t3 n
char* TempPlatePtr; 3 q" k; u4 {- V/ t/ G6 P7 }
( A/ g, Q0 Q4 |" ?( Z6 Y TemplateStream=new TBlobStream((TBlobField*)WebQuery->FieldByName
$ I: c3 F( B# l ("SearchTem"),bmReadWrite); + Y8 ~ `3 X: u
TemplatePtr= new char[TemplateStream->Size]; $ m' D* X$ m/ U- _4 N
TemplateStream->Read(TemplatePtr, TemplateStream->Size); * N: x4 Q, X9 ~/ W4 d8 M
s9 E: K- \! J8 n
BLOB字段的写入: 2 t+ X6 C4 A! K& k/ ^: L
TBlobSTream* TemplateStream; 0 _7 A+ v# f7 L' N. ?! f
char* TempPlatePtr;
$ I Y7 g, i+ N' f' p $ U) Q1 s. P$ L# B4 |
TemplateStream=new TBlobStream((TBlobField*)WebQuery->FieldByName
- l u" U/ l0 c+ y3 j B5 X ("SearchTem"),bmReadWrite); 9 J q4 D/ D5 P# `' f
TemplatePtr= new char[TemplateStream->Size]; & [9 e! \2 {) V4 \% B5 g
TemplateStream->Write(TemplatePtr, TemplateStream->Size);
, t8 W. L1 \8 w0 c4 `8 ]& r7 [ ) N+ S7 L5 V+ K, M: t3 H
________________________________________________________________ 5 s1 ^ w. X& M6 J4 O4 `
补充: $ N0 w& \% T9 c7 P' x
获得字段的大小用函数datalength
% B/ ~; Q: r( _/ |1 g4 t2 x L% L2 r " B# }) J% Q2 a/ N% S
SQL Server端要作一点设置:
& r& j0 s+ _' y: u: i. bBy default, WRITETEXT is a nonlogged operation. This means that
1 K" v& f3 H3 P$ _, p8 ^4 ptext or image data is not logged when it is written into the database.
4 C5 P9 |: F; C$ w+ t" DTo use WRITETEXT in its default, nonlogged state,
$ N- b- s" a2 s# v9 ]! E2 w//注意!! % d: _$ ]+ L8 ?* U+ r
the system administrator must use the sp_dboption system stored 5 ~0 L! e1 f9 C& L O* [, C( `8 h
procedure to set select into/bulkcopy,
( V, X& D* y8 [6 [//
0 s9 n( Q7 T1 [) b8 ^" Wwhich allows nonlogged data to be inserted.
; P, T( Q; {" @ ' @ `& ?4 @; ?: Z! o# V5 g4 s) p
做了试验,直接写SQL语句好象不行. 8 X. I. ]6 Q% y( Y& j$ @
____________________________________________________________________ , k& I5 {/ F4 `2 y4 c l! c3 p
一些注意事项和一个例子 ' z' P3 [% a( c2 X8 K) P
在写入时: 2 h1 z/ m6 g/ l! g3 S
(1)如果使用的是TTable,则要将其ReadOnly属性先置为false,然后调用Edit函数; 2 K" c# c; Z% n
(2)如果使用的是TQuery,则要将其RequestLive属性先置为true,然后调用Edit函数; 5 I0 ]! O) ^: Z
使得TTable(TQuery)是可写的.
+ w+ ~0 u7 V6 t7 g& B+ D1 N6 c ( Y9 r7 n9 H& ]/ e) c2 U0 `
下面是一个使用TQuery往content表(主键file_id)中插入一条记录的例子,
: R+ B6 j; r# N& i8 |! k% Escript为一个BLOB字段:
& K" o3 w3 N5 t1 B& _% \1 W4 N TBlobStream *pScriptStream; $ E, c( s2 P6 Y3 P' Z% }
//插入一条记录 4 O0 L6 c2 l5 G3 H) X% l8 E. x
strSQL1="insert into content(file_id,script,key_image) values('";
% p/ h; \! f$ C* I0 d" J strSQL1=strSQL1+m_szFileID+"',null,null)"; . y4 ^ `2 _! C: O# M+ Q: F! d
dmStoryEditor->qryExec->SQL->Clear();
; }" ]2 @1 b9 f) M6 _ dmStoryEditor->qryExec->SQL->Add(strSQL1);
7 M$ Z, _! b( R& h8 W dmStoryEditor->qryExec->ExecSQL();
7 I0 n2 j1 c$ o5 T2 i4 e dmStoryEditor->qryExec->Close();
# a' M9 |3 e. s, i$ n% E6 l //整理要写入的Blob数据 , d; Y. h1 w# l
LockMemories(NewsScript);
& O4 K' o* d5 C+ H; d6 B NewsScript.GetEdition(NewsScript.m_ScriptHead.byteEditionNum); % g6 c- G5 \* x+ t E* a# @
NewsScript.m_pScript=(BYTE *)GlobalLock(NewsScript.m_hScript); ) o, F: o' G# z. l
if(NewsScript.m_pScript!=NULL)
0 D2 Z% c1 r+ _6 @: G* n: K { 7 k' A' }0 C9 H+ K" W% j# _
//再将刚插入的记录读出来,使该Query与该条记录关联 & }5 e7 {. A H2 M L( r7 a" N
strSQL1="select file_id,script from content where file_id='"+ 8 S3 T% _* V2 |: k; T
m_szFileID+"'"; 9 E; {3 T& P) _' r, `" R. f
//允许该Query写 0 X' {) v) j: E3 {1 p
dmStoryEditor->qryExec->RequestLive=true; ^0 D5 R2 b& A, v, W0 n
dmStoryEditor->qryExec->SQL->Clear();
, k; E2 ^8 v7 z7 e dmStoryEditor->qryExec->SQL->Add(strSQL1);
1 v; [8 z0 {$ Q3 P( m dmStoryEditor->qryExec->Open();
7 ^; y& j& a7 L dmStoryEditor->qryExec->First(); - {1 M, M2 q/ T/ f
//将该Query置为可写 2 |/ Q5 w& O; @# N0 [
dmStoryEditor->qryExec->Edit(); # R2 z& p1 g- P# L) R
pScriptStream=new TBlobStream((TBlobField*)dmStoryEditor->
/ T3 D* K3 F' e, x8 R2 X qryExec->FieldByName("script"),bmReadWrite);
" x1 f8 v, \; H4 d6 A, Z6 g( A" Z pScriptStream->Write(NewsScript.m_pScript,
2 l, t# @' z) i1 u# x; d NewsScript.m_lScriptRealSize);
# u9 O7 a L& z. ^, E dmStoryEditor->qryExec-> ost();
& |" o( w6 F, P) ^1 p dmStoryEditor->qryExec->RequestLive=false; 1 Y6 P' e- }; L1 E
delete pScriptStream; $ {. z3 R/ I! T3 B& r, P9 _
} . D8 v' V( k2 q: S' }
GlobalUnlock(NewsScript.m_hScript);
/ O/ @' |% J2 F/ _3 b$ u0 a1 K UnLockMemories(NewsScript); |
zan
|