DELPHI如何操作ORCALE的BLOB字段(300分)

  • 主题发起人 主题发起人 websoul
  • 开始时间 开始时间
W

websoul

Unregistered / Unconfirmed
GUEST, unregistred user!
我想从PARADOX向ORCALE8移植二进制数据,
用DATA PUMP转换失败,改为用程序转换
(采用UPDATESQL提交方式)。

原PARADOX中数据定义如下:
VERSION ALPHA(30) (主键)
MODIDATE ALPHA(14)
SYMBOL BINARY (二进制数:存储矢量图形)

ORCALE8中数据定义如下:
VERSION VARCHAR2(30)(主键)
MODIDATE VARCHAR2(14)
SYMBOL BLOB (二进制数:存储矢量图形)

测试程序如下:

DataBase1.Connected:=True; //PARADOX数据库
DataBase2.Connected:=True; //ORCALE数据库
Table1.Active:=True; //PARADOX数据表
Query2.Active:=True; //ORCALE数据表
Query2.Edit;
B1:=TBlobStream.Create(Table1Symbol,bmRead);
//读出原PARADOX BLOB数据
B2:=TBlobStream.Create(Query2Sym,bmWrite);
//对应于ORACLE的BLOB字段
B2.CopyFrom(B1, B1.Size); //复制流
Query2Version.Value:=Table1Version.Value ;
Query2ModiDate.Value:=Table1ModiDate.Value ;
if Query2.State in [dsEdit,dsInsert] then
Query2.Post; //第一次提交
if Query2.UpdatesPending then
DataBase2.ApplyUpdates([Query2]); //第二次提交
B1.Free;
B2.Free;
Table1.Active:=FALSE;
Query2.Active:=FALSE;


结果在第二次提交处出错:
General SQL error.
ORA-01461 仅可以为插入LONG列的LONG值赋值。

请各位指点,谢谢!
 
我也碰到同样的问题.通过测试,我了解到用Query来控制Oracle的BLOB字段
是非常难的.主要是Oracle的BLOB类型是通过占位符来见间接指定的,与一般内
联字段不一样.但是用Table就不用考虑以上问题.而且根据你的要求,实际上用
Table是最好的.目标字段Assign源字段即可达到复制的目的.
 
以 Blob 字段创建BlobStream。
// DataSet.CreateBlobStream(...);
再将Blob流存入内存Stream或文件Stream.
// MemeryStrean.LoadFromStream(...);

但注意:如使用TQuery时,Blob大于32K字节,应将BDE的"BLOB SIZE"
设置大一些。因为默认的"BLOB SIZE"为32!
 
> to hsj
我改为用TABLE组件后,错误仍然是:
General SQL error.
ORA-01461 仅可以为插入LONG列的LONG值赋值。
不知还有什么问题?

>OopsWare
这样做的目的是什么,有些什么改善,请说详细一些好吗?

 
我在DATABASE EXPLORER中发现我的BLOB字段的LENGTH为4000,

而我的实际BLOB数据长度是25264,所以我估计是DELPHI截断了
字段的大小。是哪个选项限定了它的长度呢?
 
我在DATABASE EXPLORER中发现我的BLOB字段的LENGTH为4000,

而我的实际BLOB数据长度是25264,所以我估计是DELPHI截断了
字段的大小。是哪个选项限定了它的长度呢?

后来我成功存入了一个长度为330Bytes(小于4000)的BLOB字段,
看来关键是如何改变这个4000限制。




 
>websoul

TQuery 取的Blob字节数决定于BDE的BLOB SIZE;
TTable 的较准确。

前段时间做了一控件将JPEG存入数据库遇到此问题。
需要此控件与我联系!
 
我用BATHMOVE控件已经将数据长度是25264的BLOB转入ORACLE,
但是我用TUPATESQL的方式仍然不能修改该BLOB,是不是UPDATESQL
有什么限制?
 
>websoul
我用Table(或者TQuery),TDataSource,TDBImage,不用自己SQL编写是可以把
150k的图片读写到Oracle中,并没有任何设置.自己的代码只有:
Table1.Append; //写
...//其它字段
DBImage1.Picture.LoadFromFile('xxx.bmp');
Table1.Post;

Table.Open; //读
TBlobField(Table1.Fields[1]).SaveToFile('xxx.bmp');

用自己的SQL我也曾试过,但都失败了.有一点经验是:
Insert中对Blob字段应Empty_BLOB()初始化,也就是取的一个定位符,
用SQL Monitor观察上面的写代码就可以看到这一点.
传送小图片用SQL是可以的.如:
Insert Into 表(..,Picture,...) Values(...,HexToRaw('FFOOFFEE'),...);
其中HexToRaw是将字符串转化为16进制,是Oracle自带的函数.根据您的经验我怀疑是
整条SQL语句的长度超出范围了.

经验有限,仅能提供以上实践经过,供参考.
 
非常感谢hsj和OopsWare的热心支持!

我的BLOB存储了我自己开发的矢量图形数据,而且要经常修改,
所以我必须能够用SQL完全操纵它。
各位再想一下:我用Delphi的BatchMove例程将PARADOX的Binary类型
成功地添加到了ORACLED的BLOB字段。
但是为什么SQL不行呢?现在问题转化为如何编辑ORCALE BLOB字段,
因为它已经不是NULL。 还有什么别的思路吗?



 
我后来用LONG RAW类型实现数据移植,
不过BLOB类型仍然不能成功。
 
后退
顶部