【问题标题】:Embedded firebird not accepting create table statement嵌入式火鸟不接受创建表语句
【发布时间】:2015-11-10 14:01:03
【问题描述】:

以下 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 NULL 更改为 id int NOT NULL)时,它将标记 NOT

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

【问题讨论】:

  • CREATE TABLE 不符合 ANSI SQL。 (使用 SQL Validator 验证 ANSI/ISO SQL 语法合规性,developer.mimer.com/validator/parser200x/index.tml#parser.
  • 你能帮助我们获得一个有效的 SQL 代码来达到同样的效果吗? (请注意,Mimer SQL 验证器表明 AUTO_INCREMENT 没有替代品)。是不是说ANSI SQL不支持AUTO_INCREMENT
  • 我们通常使用生成器精简版而不是自动增量:CREATE GENERATOR GEN_JIZDA_ID;将生成器 GEN_JIZDA_ID 设置为 1; newID = gen_id(gen_jizda_id,1);
  • 此问题尚未接受答案。
  • 使用 Fb 和 adoprovider 不能一次执行多个查询看这里:stackoverflow.com/questions/33635825/…

标签: c# sql firebird firebird-embedded


【解决方案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/

【讨论】:

  • 根据您的建议,我需要做不止一个查询。我唯一想到的是transactions。我试过FbTransaction transaction = Connection.BeginTransaction( IsolationLevel.Serializable ); FbCommand command = new FbCommand( queryString, Connection, transaction ); command.ExecuteNonQuery(); transaction.Commit(); transaction.Dispose(); transaction = null;,但它总是标记第二条语句
  • 此外,整数在 Firebird 中的定义中没有精度参数(在大多数 SQL 方言中,我认为 MySQL 是一个奇怪的参数),所以 int(11) 是错误的。跨度>
  • @emmanuel 您不能一次执行多个语句。您需要单独使用每个语句; Firebird.net 提供者有一个帮助类来执行脚本。
  • @MarkRotteveel ID INT NOT NULL PRIMARY KEY 行现在给出另一个错误:"unsuccessful metadata update [newline here] key size too big for index @1"。这有什么问题?
【解决方案2】:

简单:创建/更改不能批量工作。您必须在单独的命令中使用 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();
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 2023-04-08
    • 2015-09-16
    • 2020-08-03
    • 1970-01-01
    • 2014-10-20
    • 2019-05-15
    相关资源
    最近更新 更多