使用firebird和c#创建标识字段时出现creategenerator错误

本文关键字:creategenerator 错误 字段 标识 firebird 创建 使用 | 更新日期: 2023-09-27 18:29:29

我正在使用C#;Firebird SQL数据库在我的一个win-form项目中。在表单的上,我正在firebird数据库中创建一个表,其中有一个字段"id"作为identity/autoincrement字段。我的代码是

private void createOrLoadGIIR(int pid, int tid,int mid)
    {
        string qryStrCL1 = @"EXECUTE BLOCK AS BEGIN
                                if (not exists(select 1 from rdb$relations where rdb$relation_name = 'loc_soningqp')) then
                                execute statement 'CREATE TABLE loc_soningqp (
                                  q_r_id integer NOT NULL,
                                  q_r_seccd varchar(5) NOT NULL,
                                  q_r_subseccd varchar(5) NOT NULL,
                                  q_r_direction blob,
                                  q_r_desc blob NOT NULL,
                                  q_r_caopt1 smallint DEFAULT 0,
                                  q_r_caopt2 smallint DEFAULT 0,
                                  q_r_caopt3 smallint DEFAULT 0,
                                  q_r_caopt4 smallint DEFAULT 0,
                                  q_r_caopt5 smallint DEFAULT 0,
                                  q_r_sol blob,
                                  q_r_difficulty varchar(10) DEFAULT NULL,
                                  id integer NOT NULL,
                                  PRIMARY KEY (id)
                                );';
                                CREATE GENERATOR gen_loc_soningqp_id;
                                CREATE TRIGGER loc_soningqp_bi FOR loc_soningqp
                                ACTIVE BEFORE INSERT POSITION 0
                                AS
                                BEGIN
                                  IF (NEW.id IS NULL) THEN
                                  NEW.id = GEN_ID(gen_loc_soningqp_id,1);
                                END^
                                END";
        try
        {
            using (FbConnection conCL1 = new FbConnection(connectionString))
            {
                conCL1.Open();
                using (FbCommand cmdCL1 = new FbCommand(qryStrCL1, conCL1))
                {
                    cmdCL1.CommandType = CommandType.Text;
                    using (FbDataReader rdrCL1 = cmdCL1.ExecuteReader())
                    {
                        if (rdrCL1 != null)
                        {
                            //some code
                        }
                    }
                }// command disposed here
            } //connection closed and disposed here
        }
        catch (FbException ex)
        {
            //table exists
            MessageBox.Show(ex.Message);
        }
    }

当我运行代码时,它在CREATE GENERATOR行附近生成一个错误,说"CREATE是一个未知令牌"。请告知我的代码有什么问题。我还想知道是否可以在EXECUTE BLOCK中创建存储过程。

使用firebird和c#创建标识字段时出现creategenerator错误

查询中存在错误。我认为应该是这样的:

"EXECUTE BLOCK AS BEGIN
  if (not exists(select 1 from rdb$relations where rdb$relation_name = 'loc_soningqp')) then
  begin
    execute statement 'CREATE TABLE loc_soningqp (
      q_r_id integer NOT NULL,
      q_r_seccd varchar(5) NOT NULL,
      q_r_subseccd varchar(5) NOT NULL,
      q_r_direction blob,
      q_r_desc blob NOT NULL,
      q_r_caopt1 smallint DEFAULT 0,
      q_r_caopt2 smallint DEFAULT 0,
      q_r_caopt3 smallint DEFAULT 0,
      q_r_caopt4 smallint DEFAULT 0,
      q_r_caopt5 smallint DEFAULT 0,
      q_r_sol blob,
      q_r_difficulty varchar(10) DEFAULT NULL,
      id integer NOT NULL,
      PRIMARY KEY (id)
     );';
     execute statement 'CREATE GENERATOR gen_loc_soningqp_id;';
     execute statement '        
     CREATE TRIGGER loc_soningqp_bi FOR loc_soningqp
     ACTIVE BEFORE INSERT POSITION 0
     AS
     BEGIN
       IF (NEW.id IS NULL) THEN
       NEW.id = GEN_ID(gen_loc_soningqp_id,1);
     END^
    ';
  end
END";

问题是不允许在PSQL代码中执行DDL(如EXECUTE BLOCK)。正如Evgeny在他的回答中已经显示的那样,您还需要将CREATE GENERATORCREATE TRIGGER语句封装在EXECUTE STATEMENT中。使用EXECUTE STATEMENT作为变通方法是聪明的,但有时会有点麻烦。