带有.net驱动程序的Firebird - 如果存在则删除表

时间:2018-04-21 23:16:45

标签: sql .net ado.net firebird

我是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

你能帮我解决这个问题吗?我试图在网上找到更多可以帮助我的信息,但没有任何运气。

1 个答案:

答案 0 :(得分:0)

Firebird的SQL语法没有drop table if exists,而是使用recreate tablerecreate table会在创建表之前尝试删除该表。 recreate table的语法是 - recreate而不是create - 与create table相同。

您尝试使用execute block失败的原因有两个:

  1. 您不能将两个语句一起作为命令执行。如果要执行多个语句的脚本,则需要单独执行每个语句或使用FbScript类来解析脚本并为您执行单独的语句。
  2. 即使您单独执行这些语句,它仍然会失败,因为PSQL(execute block中使用的存储过程语言)不允许执行DDL。您可以使用execute statement来规避此限制,但最好不要这样做。通过这种方式,您还可以通过execute statement内的execute block执行两者来解决上一点。
  3. 或者你可以无条件地删除表并捕获(并忽略)生成的异常。