我正在使用C#& Firebird SQL db在我的一个win表单项目中。在表单中,我在firebird db中创建一个表,其中包含一个字段" id"作为身份/自动增量字段。我的代码是
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中创建存储过程。
答案 0 :(得分:4)
您的查询中存在错误。我认为它应该是这样的:
"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";
答案 1 :(得分:3)
问题是您不允许在PSQL代码中执行DDL(如EXECUTE BLOCK
)。在Evgeny already shows in his answer时,您还需要将CREATE GENERATOR
和CREATE TRIGGER
语句包含在EXECUTE STATEMENT
中。使用EXECUTE STATEMENT
作为解决方法很聪明,但有时候有点麻烦。