hur.cn - 华软网

 热门搜索

无法在用户事务内部使用kill命令!

  作者:未知    来源:网络    更新时间:2017/9/29
我是用pb做一个自动解锁的程序,在pb程序当中执行到EXECUTE IMMEDIATE :ls_sql; 其中ls_sql = "kill 进程号" 。执行此句后提示“无法在用户事务内部使用kill命令!”
我在sql server查询分析器中执行“kill 进程号”是可以杀掉进程的,为什么在pb中就不行呢。
我用的是sqlserver 2000。
------华软网友回答------
kill不是sql语句而是sql server的管理命令,sql server查询分析器是支持kill命令的.pb中sqlca事物是直接关联到数据库的.
------华软网友回复------
为什么以前在sqlserver 7.0中是可以的,移植到sql2000就不行了。困惑!!如果如你所说的有没有什么解决办法呢?
------华软网友回复------
试试把SQLCA.AutoCommit 设为 True,同时注意登陆数据库用户要有sa权限,具体参考:

http://search.csdn.net/Expert/topic/1421/1421700.xml?temp=.8722345
------华软网友回复------
to : balloonman2002(Blog.csdn.net/balloonman2002 - 抵制日货) 
可以了,但为什么要将SQLCA.AutoCommit 设为 True呢?
先接分吧!
------华软网友回复------
具体原因:这是PB帮助中自带的说明

Using AutoCommit

The setting of the AutoCommit property of the transaction object determines whether 

PowerBuilder issues SQL statements inside or outside the scope of a transaction. When 

AutoCommit is set to False or 0 (the default), SQL statements are issued inside the scope of a 

transaction. When you set AutoCommit to True or 1, SQL statements are issued outside the scope 

of a transaction.
SQL Server requires you to execute Data Definition Language (DDL) statements outside the scope 

of a transaction. If you execute a database stored procedure that contains DDL statements 

within the scope of a transaction, an error message is returned and the DDL statements are 

rejected. When you use the transaction object to execute a database stored procedure that 

creates a temporary table, you do not want to associate the connection with a transaction.

To execute SQL Server stored procedures containing DDL statements, you must set AutoCommit to 

True so PowerBuilder issues the statements outside the scope of a transaction. However, if 

AutoCommit is set to True, you cannot issue a ROLLBACK. Therefore, you should set AutoCommit 

back to False (the default) immediately after completing the DDL operation.
When you change the value of AutoCommit from False to True, PowerBuilder issues a COMMIT 

statement by default.

核心就是因为包括了DDL语句,但AUTOCOMMIT为TRUE时无法ROLLBACK,因此修改AUTOCOMMIT为TRUE后,必须尽快修改回FALSE。类似的创建临时表、临时存储过程等的动态SQL执行时也必须将AUTOCOMMIT改为TRUE。      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。