事务中的Firebird DDL + DML语句

时间:2013-06-10 10:49:40

标签: c# transactions firebird

在事务中有没有办法在Firebird中执行以下操作?

 CREATE TABLE a (INTEGER c1);
 INSERT INTO a (c1) VALUES (1);
 DROP TABLE a

如果没有,为什么不呢?

有任何变通方法吗?尝试过保存点,ADO.NET事务,似乎没什么用。

更新的 Firebird事务不会很好地混合DDL和DML语句。您可以创建表,但它们在事务中不可见。需要两个单独的交易(或根本不需要交易)。此外,不要打扰匿名事务或执行块,因为它们似乎无法通过电线工作。

1 个答案:

答案 0 :(得分:4)

Firebird不支持在创建它的同一事务中使用表。此外,我没有看到你在这里做什么(创建,填充和删除表)。也许您正在寻找Firebird的Global Temporary Table功能:您可以定义一次表(例如,使用ON COMMIT DELETE ROWS),然后您可以重复使用其定义,而无需每次都重新创建表。

当您评论要使用此表存储“变量”时,您还可以查看RDB$SET_CONTEXT()RDB$GET_CONTEXT()(Firebird 2.0及更高版本)的使用情况),它允许您在连接或事务上下文中存储值。

例如,这会将变量VariableName设置为(VARCHAR)值'513'

select rdb$set_context('USER_SESSION', 'VariableName', 513) from rdb$database

然后您可以使用以下方法检索它:

select rdb$set_context('USER_SESSION', 'VariableName') from rdb$database

如果您需要INTEGER,则需要添加明确的演员。