我是Firebird的新手,我正在测试一些东西来检查Fb和SQlite(以及.net驱动程序)之间的差异。
如果存在,则尝试执行drop table,然后创建表。在Sqlite中,我可以通过以下方式完成此操作:
command.CommandText = @"DROP TABLE IF EXISTS Persons; CREATE TABLE Persons (
PersonID int,
LastName text,
FirstName text,
Address text,
City text); ";
command.ExecuteNonQuery();
但是在Firebird中,同样的查询失败了。我已经读过,在Firebird SQL中直接使用IF是不可能的,所以我尝试使用:
command.CommandText = @"
EXECUTE BLOCK AS
BEGIN IF EXISTS
(SELECT RDB$RELATION_NAME FROM RDB$RELATIONS WHERE RDB$RELATION_NAME = 'Persons')
THEN DROP TABLE Persons; END CREATE TABLE Persons (
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
); ";
command.ExecuteNonQuery();
但它也失败了以下错误:
动态SQL错误SQL错误代码= -104令牌未知 - 第1行,列 27
你能帮我解决这个问题吗?我试图在网上找到更多可以帮助我的信息,但没有任何运气。
答案 0 :(得分:0)
Firebird的SQL语法没有drop table if exists
,而是使用recreate table
。 recreate table
会在创建表之前尝试删除该表。 recreate table
的语法是 - recreate
而不是create
- 与create table
相同。
您尝试使用execute block
失败的原因有两个:
FbScript
类来解析脚本并为您执行单独的语句。execute block
中使用的存储过程语言)不允许执行DDL。您可以使用execute statement
来规避此限制,但最好不要这样做。通过这种方式,您还可以通过execute statement
内的execute block
执行两者来解决上一点。或者你可以无条件地删除表并捕获(并忽略)生成的异常。