Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用firebird和c创建标识字段时出现创建生成器错误#_C#_Sql_Firebird_Firebird Embedded - Fatal编程技术网

C# 使用firebird和c创建标识字段时出现创建生成器错误#

C# 使用firebird和c创建标识字段时出现创建生成器错误#,c#,sql,firebird,firebird-embedded,C#,Sql,Firebird,Firebird Embedded,我正在我的一个win form项目中使用C#&Firebird SQL db。在表单的on中,我正在firebird db中创建一个表,其中有一个字段“id”作为identity/autoincrement字段。我的代码是 private void createOrLoadGIIR(int pid, int tid,int mid) { string qryStrCL1 = @"EXECUTE BLOCK AS BEGIN

我正在我的一个win form项目中使用C#&Firebird SQL db。在表单的on中,我正在firebird db中创建一个表,其中有一个字段“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块内创建存储过程。

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

"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块
)。同样,您还需要将
CREATE GENERATOR
CREATE TRIGGER
语句包装在
EXECUTE语句中。使用
EXECUTE语句
作为解决方法是聪明的,但有时会有点麻烦。

为什么不在db或in.Sql文件上正确创建
Sql
,然后从C启动它?这里有一个链接,可以向您展示如何用两行代码执行脚本。。下一次做一个简单的谷歌搜索以及什么是确切的逐字错误消息请。(包括任何相关错误号等)它仍然在第18行第29列CREATE处显示错误:(嗯,尝试使用触发器创建删除最后一个
execute语句
,并检查它是否工作感谢@Evgeny。我删除了行集合项^;现在它工作得很好:)