在mts中创建数据库表(200分)

  • 主题发起人 主题发起人 firstshine
  • 开始时间 开始时间
F

firstshine

Unregistered / Unconfirmed
GUEST, unregistred user!
我建立了一个需要事务的mts object,他调用了一个支持事务的mts data module。
现在我希望在mts data module 的接口中建立一个函数供mts object 调用。这个函数
要实现这样的功能:命令oracle 8.0.5创建一个数据库表(create table)。我试过一下
以下两种方法,都不行。
1、从客户端传过来一个定义好的字符串(如:create table a (a1 char(1) primary key))
在mts data module 放一个datasetprovidre,adoquery,adoconnection。然后
在接口方法中调用as_execute方法,并进客户端传递过来的字符串传递过去。
mts data module中的方法在执行中报错:ora-02089,commit不允许在附属会话中
2、在oracle中定义一个存储过程,存储过程调用dbms_sql建立表。存储过程是正确的,
因为通过sqlplus可以成功的调用。然后我在mts data module中放一个adostoreproc,
通过调用adostoreproc的方法来实现。这种方法在运行是不报任何错误,但是表依然
没有产生。
我想这是two phase commit的问题,因为create table 是一个ddl,他在执行时是要求
自动提交的,但是mts的事务必须通过two phase commit来实现。可能是因为这两种提交
方法冲突造成了这个错误。不知道是不是这样?如何解决这个问题?
 
Error Message:
ORA-02089 COMMIT is not allowed in a subordinate session
Cause: COMMIT was issued in a session that is not the two-phase commit
global coordinator.
Action: Issue commit at the global coordinator only.
 
我想应该是可以的.你能不能贴上你的部分源码?
另外,你有没有设断点追踪你的MTS,若你的MTS有错,你不设定的话,客户端并不知道出了错.
所以,也许你的程序在MTS中没有成功,但你以为是其他错误.你还是设好断点跟踪一下就知道
具体出错在哪个地方了.
 
mts data module的事务类型是需要事务。
mts data module中的方法,这个方法定义在接口中,被其他对象或者客户端调用
procedure TSjfwdx.Yjzx(const sSql: WideString);
//语句执行
// sSql:需要执行的sql语句
var
params,OwnerData:OleVariant;
begin
try
AS_Execute('DataSetProvider1',sSql,Params,OwnerData);
//跟踪过了,这一行出错,出错信息就是楼上的ora-02089错误
SetComplete;
except
SetAbort;
end;
end;
 
这个是没有问题的,我的一个应用程序就是采用D5+MTS+MS SQL Server,创建表的时候我
采用的方法是:调用存储过程,没有问题,再检查一下你现在的代码。
 
多人接受答案了。
 
后退
顶部