问题:用DELPHI读写ORACLE中的BLOB类型字段(内详),请高手指点!

rlongriver 2002-09-19 04:02:26
1.下面的语句在SQL EXPLORER 中执行通过,用SELECT(在ENTER SQL处输入)查看此表也可以,但直接选表,查看DATA,会报错:“General SQL ERROR, ORQ-00936: 缺少表达式”,请问是为什么?
-----------------------------------------
CREATE TABLE TMPTABLE (
GNAME VARCHAR2(10),
AAA BLOB
)
-----------------------------------------

2.现在要向TMPTABLE写入数据,如果要把richedit的内容写入AAA中,如何做,能写上代码最好,谢!我在保留区搜了一些也看了,用流文件,可还是有问题。
----------------------------------------
s1 := 'insert into tmptable (gname,aaa) values ('+''''+ComboBox3.Text+''''+',:edittext)';
query2.SQL.Add(s1);
Query2.ParamByName('aaa').LoadFromStream(bstream,ftOraBlob);
//执行是报什么 LOB定位器错,请高手指点

------------------------------------------------
3.把AAA的内容导到richedit中怎么做,我看了些贴子大多是导出文件,再请指点


-----------------------------------------------------------
*****************
这是我按一个贴子的例子改写的,在激活TABLE1时也报 ORQ-00936: 缺少表达式
var
st :TMemoryStream;
begin
//Table1.TableName := 'tmptable';
//Table1.Active := true;
try
st := TMemoryStream.Create;
st.Clear;
RichEdit1.Lines.SaveToStream(st);
if not (Table1.State in [dsEdit, dsInsert]) then
table1.Append;
TBlobField(Table1.FieldByName('edittext')).LoadFromStream(st);
Table1.Post;
except
st.Free;
end;
st.Free;
end;
-------------------------------------------------------
总之,希望高手给说详细点,分不够可以再加,大家来讨论一下吧,谢
...全文
472 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
junerr 2002-09-20
  • 打赏
  • 举报
回复
to see:
http://www.csdn.net/expert/topic/1017/1017585.xml?temp=.3102686
junerr 2002-09-20
  • 打赏
  • 举报
回复
我没用过Oracal的BLOB类型,也许问题就出在它的身上,你方便的话换成LongRaw的试试
junerr 2002-09-20
  • 打赏
  • 举报
回复
2.
>>Query2.ParamByName('aaa').LoadFromStream(bstream,ftOraBlob);
改成:
Query2.ParamByName('edittext').LoadFromStream(bstream,ftOraBlob);

如果还有问题试一试把ftOraBlob换成ftBlob

还有记得流的游标置零

3.
var Stream: Tmemorystream;

//RichEdit写入字段aaa
with Table1 do
begin
Append;
stream.Clear ;
richedit1.Lines.SaveToStream(stream);
stream.Position :=0;
(FieldByName('aaa') as TBlobField).LoadFromStream(Stream);
post;
end;

//读字段aaa到RichEdit
Stream.Clear ;
TblobField(table1.FieldByName('aaa')).savetostream(stream);
stream.Position :=0;
richedit1.lines.clear;
richedit1.lines.LoadFromStream(stream);



rlongriver 2002-09-20
  • 打赏
  • 举报
回复
为什么没人来回答一下,没人帮一下哪?????????
rlongriver 2002-09-20
  • 打赏
  • 举报
回复
TO: junerr(路在何方),
你的代码应该是对的,我还存在个问题是,在激活TABLE1时报 ORQ-00936: 缺少表达式;这可能是表建 的有问题,如知是什么原因还请告知!
=====================================
CREATE TABLE TMPTABLE (
GNAME VARCHAR2(10),
AAA BLOB
)
dhjdut 2002-09-20
  • 打赏
  • 举报
回复
默认的BDE的BLOB字段的大小是32K,可以再BDE Administrator中修改
junerr 2002-09-20
  • 打赏
  • 举报
回复
我贴出来的代码都是测试过没有问题的呀

哪里还有问题,说出来看看
rlongriver 2002-09-20
  • 打赏
  • 举报
回复
我已看了不少贴子和例子,可还是有问题,脑子笨,还各位多指点!
wyb_45 2002-09-20
  • 打赏
  • 举报
回复
关于读写BLOB字段的例子很多,
我加一句,在读写ORACLE的BLOB时要注意BDE的Blob size参数。默认还是10k,太小了。
Ssm 2002-09-20
  • 打赏
  • 举报
回复
第一点:就我以前的经历,oracle数据库你最好有一个Primary Key,强烈建议
第二点:读例(我刚完成的项目中的)

//==============================================================================
//功能:从批量交易表中读出当前的交易信息
//入参:aRecIndex 当前的批量交易表的记录号
//出参:aBITran 交易数据信息
//返回:当数据库操作正常 返加true 否则返回 false
//==============================================================================
function ReadRecFmBatchTab(const aRecIndex:Integer;
aDatabase:TDatabase;
var aBITran:TBITran):Boolean;
var
mQuery:TQuery;
BlobStream:TStream;
begin
Result:=true;
mQuery:=TQuery.Create(nil);
mQuery.DatabaseName:=aDataBase.DatabaseName;
mQuery.SessionName:=aDataBase.SessionName;
mQuery.SQL.Clear;
with mQuery do
begin
Sql.Add('SELECT * FROM BATCHTRANS_TAB WHERE TINDEX='+IntToStr(aRecIndex));
try
try

mQuery.Open;
aBITran.RecIndex:=aRecIndex;
aBITran.BznsCode:=FieldByName('TRANS_CODE').AsInteger;
aBITran.BznsCtrl.BznsCtrlNo:=FieldByName('TRANS_CTRLNO').AsInteger;
aBITran.BznsCtrl.BznsSta:=FieldByName('TRANS_STATE').AsInteger;
aBITran.BznsCtrl.BznsNode:=FieldByName('TRANS_NODE').AsInteger;
aBITran.BznsCtrl.NodeSta:=FieldByName('TRANS_NODESTATE').AsInteger;
aBITran.UnitNo :=FieldByName('UNITNO').AsString;
aBITran.Card :=FieldByName('CUST_CARDNO').AsString;
aBITran.Ywh :=FieldByName('CUST_AGENTNO').AsString;
aBITran.Jzlsh :=FieldByName('UNITSERIAL').AsString;
aBITran.Sfbh :=FieldByName('SFBH').AsInteger;
aBITran.Zjfys :=FieldByName('ZJFYS').AsInteger;
aBITran.Zqfys :=FieldByName('ZQFYS').AsInteger;
aBITran.IFTRXSERNB :=FieldByName('HOSTSERIAL').AsInteger;
aBITran.PreAmount :=FieldByName('TRANS_PREAMOUNT').AsFloat;
aBITran.RealAmount :=FieldByName('TRANS_AMOUNT').AsFloat;
aBITran.Balance :=FieldByName('TRANS_BALANCE').AsFloat;

BlobStream:=CreateBlobStream(FieldByName('CONTENTS'),bmRead);
BlobStream.Read(aBITran.Content,BlobStream.Size+1);

except
Result:=false;
end;
finally
Free;
end;
end;
end;


第三点:写例:

//==============================================================================
//功能:向批量交易表中写入交易数据信息和交易控制信息
//入参:aRecIndex 当前的批量交易表的记录号
// aBITran 交易数据信息
// aBznsCtrl 交易控制信息
//返回:当数据库操作正常 返加true 否则返回 false
//==============================================================================
function WriteRecToBatchTab(const aRecIndex:Integer;
aDataBase:TDatabase;
const aBITran:TBITran):Boolean;
var
mQuery:TQuery;
MS:TMemoryStream;
begin
Result:=true;
mQuery:=TQuery.Create(nil);
mQuery.DatabaseName:=aDataBase.DatabaseName;
mQuery.SessionName:=aDataBase.SessionName;
mQuery.SQL.Clear;
with mQuery do
begin
//组装mQuery的sql语句
SQL.Add('UPDATE BATCHTRANS_TAB SET TRANS_STATE=:TRANS_STATE,'+
'TRANS_NODE=:TRANS_NODE,TRANS_NODESTATE=:TRANS_NODESTATE,'+
'HOSTSERIAL=:HOSTSERIAL,TRANS_PREAMOUNT=:TRANS_PREAMOUNT,'+
'TRANS_AMOUNT=:TRANS_AMOUNT,TRANS_BALANCE=:TRANS_BALANCE,'+
'UNITSERIAL=:UNITSERIAL,'+
'SFBH=:SFBH,ZQFYS=:ZQFYS,ZJFYS=:ZJFYS,TRANS_MEMO=:TRANS_MEMO,'+
'CONTENTS=:CONTENTS'+
' WHERE TINDEX=:TINDEX');

MS:=TMemoryStream.Create;
try

MS.Write(aBITran.Content,StrLen(aBITran.Content));
try
ParamByName('TINDEX').AsInteger:=aBITran.RecIndex;
ParamByName('TRANS_STATE').AsInteger:=aBITran.BznsCtrl.BznsSta;
ParamByName('TRANS_NODE').AsInteger:=aBITran.BznsCtrl.BznsNode;
ParamByName('TRANS_NODESTATE').AsInteger:=aBITran.BznsCtrl.NodeSta;
ParamByName('HOSTSERIAL').AsInteger:=aBITran.IFTRXSERNB;
ParamByName('TRANS_PREAMOUNT').AsFloat:=aBITran.PreAmount;
ParamByName('TRANS_AMOUNT').AsFloat:=aBITran.RealAmount;
ParamByName('TRANS_BALANCE').AsFloat:=aBITran.Balance;
ParamByName('UNITSERIAL').AsString:=aBITran.Jzlsh;
ParamByName('SFBH').AsInteger:=aBITran.Sfbh;
ParamByName('ZQFYS').AsInteger:=aBITran.Zqfys;
ParamByName('ZJFYS').AsInteger:=aBITran.Zjfys;
ParamByName('TRANS_MEMO').AsString:=aBITran.Describe;
ParamByName('CONTENTS').LoadFromStream(MS,ftMemo);
aDataBase.StartTransaction;
ExecSQL;
aDataBase.Commit;
except
Result:=false;
aDataBase.RollBack;
end;
finally
Free;
MS.Free;
end;
end;
end;
junerr 2002-09-19
  • 打赏
  • 举报
回复
1.用Long Raw类型可能更好一些。BLOB是后来才有的类型,用法我不清楚;而LongRaw比较早就有了,我用了很多都没有什么问题。建议用LongRaw来试一试。
本课程详细讲解了以下内容:    1.jsp环境搭建及入门、虚拟路径和虚拟主机、JSP执行流程    2.使用Eclipse快速开发JSP、编码问题、JSP页面元素以及request对象、使用request对象实现注册示例    3.求方式的编码问题、response、求转发和重定向、cookie、session执行机制、session共享问题     4.session与cookie问题及application、cookie补充说明及四种范围对象作用域     5.JDBC原理及使用Statement访问数据库、使用JDBC切换数据库以及PreparedStatement的使用、Statement与PreparedStatement的区别     6.JDBC调用存储过程和存储函数、JDBC处理大文本CLOB及二进制BLOB类型数据     7.JSP访问数据库、JavaBean(封装数据和封装业务逻辑)     8.MVC模式与Servlet执行流程、Servlet25与Servlet30的使用、ServletAPI详解与源码分析     9.MVC案例、三层架构详解、乱码问题以及三层代码流程解析、完善Service和Dao、完善View、优化用户体验、优化三层(加入接口和DBUtil)    1 0.Web调试及bug修复、分页SQL(Oracle、MySQL、SQLSERVER)     11.分页业务逻辑层和数据访问层Service、Dao、分页表示层Jsp、Servlet     12.文件上传及注意问题、控制文件上传类型和大小、下载、各浏览器下载乱码问题     13.EL表达式语法、点操作符和括号操作符、EL运算、隐式对象、JSTL基础及set、out、remove     14.过滤器、过滤器通配符、过滤器链、监听器     15.session绑定解绑、钝化活化     16.以及Ajax的各种应用     17. Idea环境下的Java Web开发

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧