1

以下 SQL 代码在 MYSQL 上运行良好,并且包含有效的 SQL 查询语言。但是,这在嵌入式 Firebird 服务器上不起作用。

SQL 代码:

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;

使用查询的 C# 代码是:

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;
}

fresh_db_creation_statement 是第一个代码清单中的 sql 代码。

错误被捕获lasterror = exx.Message;的值为: "Dynamic SQL Error\nSQL error code = -104\nToken unknown - line 2, char 13",这意味着(被嵌入式 firebird 标记(即line 2, char 13)。

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

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

4

2 回答 2

1

据我所知,存在各种问题

  1. 为什么你用你在创建时已经可以做的语句来改变表:

    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/

于 2015-11-10T14:23:22.250 回答
0

简单地说:创建/更改不能批量工作。您必须在单独的命令中使用 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();
        }
于 2015-11-10T14:32:03.437 回答