嵌入式 firebird 不接受创建 table 语句
Embedded firebird not accepting create table statement
以下 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 接受此查询并正常执行?
据我所知,存在各种问题
为什么你要用你已经可以在创建时做的声明来改变 table:
id int not null primary key,
filename varchar(500) not null unique,
lastmodified timestamp default CURRENT_TIMESTAMP
autoincrement不存在,需要自己构建触发器,看这里:
http://www.firebirdfaq.org/faq29/
不存在更改时自动更新时间戳,您也需要构建触发器,请参见此处:
http://www.firebirdfaq.org/faq77/
简单地说:Create/Alter不能批量工作。您必须在单独的命令中使用 sql。
如果你想批量使用这些命令,你必须使用 EXECUTE BLOCK AS BEGIN ...但是创建 table 不起作用 ...看。以下
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();
}
以下 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 接受此查询并正常执行?
据我所知,存在各种问题
为什么你要用你已经可以在创建时做的声明来改变 table:
id int not null primary key,
filename varchar(500) not null unique,
lastmodified timestamp default CURRENT_TIMESTAMP
autoincrement不存在,需要自己构建触发器,看这里: http://www.firebirdfaq.org/faq29/
不存在更改时自动更新时间戳,您也需要构建触发器,请参见此处: http://www.firebirdfaq.org/faq77/
简单地说:Create/Alter不能批量工作。您必须在单独的命令中使用 sql。
如果你想批量使用这些命令,你必须使用 EXECUTE BLOCK AS BEGIN ...但是创建 table 不起作用 ...看。以下
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();
}