嵌入式firebird不接受create table语句

时间:2015-11-10 14:01:03

标签: c# sql firebird firebird-embedded

以下SQL代码在MYSQL上运行良好,它包含有效的SQL查询语言。但是,这对嵌入式Firebird服务器无效。

SQL代码:

Integer

使用该查询的C#代码为:

CREATE TABLE publications (
  id int(11) NOT NULL,
  filename varchar(500) NOT NULL,
  title varchar(500) DEFAULT NULL,
  authors varchar(1000) DEFAULT NULL,
  uploader int(7) DEFAULT NULL,
  keywords varchar(500) DEFAULT NULL,
  rawtext text,
  rawbinarydata blob NOT NULL,
  lastmodified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

ALTER TABLE publications
  ADD PRIMARY KEY (id),
  ADD UNIQUE KEY filename (filename);

ALTER TABLE publications
  MODIFY id int(11) NOT NULL AUTO_INCREMENT;

try { using( cmd.Connection = connect_to_fbserver() ) { cmd.CommandText = fresh_db_creation_statement; cmd.Connection.Open(); cmd.ExecuteNonQuery(); } return true; } catch( Exception exx ) { lasterror = exx.Message; return false; } 是第一个代码清单中的sql代码。

错误在fresh_db_creation_statement处被捕获,其值为lasterror = exx.Message;,表示"Dynamic SQL Error\nSQL error code = -104\nToken unknown - line 2, char 13"已被嵌入式火鸟标记(即()。

当我删除所有已定义数据值类型的大小时(例如,将line 2, char 13更改为id int(11) NOT NULL),它会标记id int NOT NULL

如何让Firebird接受此查询并正常执行?

2 个答案:

答案 0 :(得分:1)

从我所看到的,存在各种问题

  1. 为什么要用statemens改变表格,你可以在创建时使用:

    id int not null primary key,

    filename varchar(500) not null unique,

    lastmodified timestamp default CURRENT_TIMESTAMP

  2. 自动增量不存在,需要构建触发器,请参见此处: http://www.firebirdfaq.org/faq29/

  3. 在更改时自动更新时间戳不存在,您还需要构建一个触发器,请参见此处: http://www.firebirdfaq.org/faq77/

答案 1 :(得分:0)

简单地说:Create / Alter不能批量生效。您必须在单独的Command中使用sql。

如果要批量使用命令,则必须使用EXECUTE BLOCK AS BEGIN ...但是然后创建表不起作用...请参阅。以下

          string sqlText = "create table pub(id int not null);";//----  OK ----
        //string sqlText = "EXECUTE BLOCK AS BEGIN \ncreate table pub(id int not null);\nalter table pub add primary key (id);\nEND";//----  FAILED  ----
        //string sqlText = "EXECUTE BLOCK AS BEGIN \nupdate jizda set cislovozidla = 99999 where cislovozidla = 999899;\nalter table pub add primary key (id);\nEND";//----  FAILED ----
        //string sqlText = "EXECUTE BLOCK AS BEGIN \nupdate jizda set cislovozidla = 99999 where cislovozidla = 999899;\nupdate jizda set cislovozidla = 99999 where cislovozidla = 99989;\nEND";//----  OK ----
        using (FbConnection dbConnection = new FbConnection(Program.ConnectDBData()))
        {
          dbConnection.Open();
          FbCommand cmd = new FbCommand(sqlText);
          cmd.CommandType = CommandType.Text;
          cmd.Connection = dbConnection;
          cmd.ExecuteNonQuery();
        }