关于ORCALE8与DELPHI连接的问题(200分)

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

websoul

Unregistered / Unconfirmed
GUEST, unregistred user!
我这几天要将原PARADOX下的内容移植到ORACLE中,用DATA PUMP失败,
没办法我放弃这种方法。

后来我在ORCALE中手工建立了相应的数据表,碰到如下情况:

1.没有BLOB字段的普通数据表TEST1:
用TABLE组件访问TEST1表,采用用UPDATESQL维护,
打开TABLE时出错:
Key violation [Oracle][ODBC][Ora]ORA-00904:无效别名。
用QUERY访问时,
如果TEST1有关键字时,修改数据提交成功;
如果TEST2没有关键字时,提交出错update failed.

2.含有BLOB字段的数据表TEST2:

修改数据并提交时,出错:
Key violation [Oracle][ODBC][Ora]ORA-03127:在活动操作结束之前
不能进行新的操作。

希望各位高手在ORCALE与DELPHI连接, 以及ORCALE的BLOB(是LONG RAW
类型吗?)操作方面给予帮助,谢谢!


 
1:Oracle和delphi的连接可以不通过ODBC,delphi的BDE提供有现成的接口。
具体方法是:可以在Sql_explor中左边的别名中点右键,选择"New",
然后在弹出的下拉框中选择“Oracle”,回车确认。然后在新增加的别名
属性上填上用户名、在“Server Name”中填入配置的NetEasy名称
(oracle8可能不叫NetEasy,叫Net吧)。就可以看作本地表使用了。
2:Blob存的是甚末?图象?还是备注?如果是备注,请换成varchar2类型。
 
BLOB存储的是矢量图形信息,以Stream的方式存入。
不能用VARCHAR2类型。
我现在是用BDE直接连接的,但是转换还是有错误。

具体情况如下:

我想从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值赋值。

请各位指点,谢谢!

 
》websoul
讨论完了后可不可以发个EMAIL给我呀。
 
:( :<
怎么还没有人帮我呀!


》pyh_jerry OK
 
用Delphi 中的Data Migration Wizard 方便又快洁
注意的问题:
1 oracle中二进制信息用long raw 字段
2 数据倒完后,select * from tab ,表名可能为小写,
用select * from "tablename" 才可,或在oracle 中重建表
但倒起来方便许多。
 
if you have doa 3.0 (direct oracle access) component you can do that thing.
I have mailed one to one delphi fun,but now I do not have it in my machine. you can ask others for help or visit websites to look for this component.
good luck to you
 
关于用delphi访问Oracle数据库的BLOB类型是比较困难的.因为BLOB是采用占位符
来间接得到数据的.换句话说,象提取其它字段的方法Select field into var from
table.得到的结果只是一个占位符(相当于指针).具体用TQuery来操作我试了好几种
办法,都不成功.但对于BLOB字段内容比较少的可以使用TQuery.如:
INSERT INTO 表(...,MyBlob,...) Values(...,HEXTOROW('FFOOFF'),...);
HexToRow是Oracle内置函数,作用是将字符串转化为十六进制.但是对于大容量的
字段就要发生类似堆栈溢出的错误.不过用Table可以操作.与其它字段操作方法一样.
Delphi的TBlobField可供使用.
 
我改为用TABLE组件后,错误仍然是:
General SQL error.
ORA-01461 仅可以为插入LONG列的LONG值赋值。

不知还有什么问题?


 
我用BATHMOVE控件已经将数据长度是25264的BLOB转入ORACLE,
但是我用TUPATESQL的方式仍然不能修改该BLOB,是不是UPDATESQL
有什么限制?

 
DElPHI 与 ORACLE8 的直接连接需要 OCI.DLL
 
后来我用Long Raw字段,先用Data Pump转换,
数据库传输不正确的表改为用BatchMove拷贝,所有移植成功。
关键是每个表最好有主关键字。
 
oracle8的blob字段经常(比如ado之类)都不支持(虽然它更先进),
所以要用long raw 这个落后一点的类型比较好
 
多人接受答案了。
 
后退
顶部