有什么方法可以在 Firebird 中的事务中执行以下操作吗?
CREATE TABLE a (INTEGER c1);
INSERT INTO a (c1) VALUES (1);
DROP TABLE a
如果没有,为什么不呢?
有什么解决办法吗?尝试了保存点、ADO.NET 事务,似乎没有任何效果。
更新 Firebird 事务不能很好地混合 DDL 和 DML 语句。您可以创建表,但它们在事务中不可见。需要两个单独的事务(或根本不需要事务)。另外,不要担心匿名事务或执行 block ,因为它们似乎无法通过网络工作。
最佳答案
Firebird 不支持在创建的同一事务中使用表。另外,我不明白你在这里所做的事情(创建、填充和删除表格)的意义。也许您正在寻找 Global Temporary Table Firebird 的功能:您定义表一次(例如使用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
,则需要添加显式强制转换。
关于c# - 事务中的 Firebird DDL + DML 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17022126/