您的查询不符合 Firebird 语法。驱动程序一次只能执行一条语句(注意 anEXECUTE BLOCK
被认为是一条语句)。您不应该使用SET TERM
,它是 ISQL 工具(以及其他一些查询工具,如 FlameRobin)的产物,实际上并不是 Firebird SQL 语言的一部分。
您也不应该包含;
在查询中。这些仅在 1)PSQL(存储过程、触发器和内部EXECUTE BLOCK
)和 2)再次在 ISQL 等工具中有效,以分隔(结束)语句。
因此,单独使用以下查询就足够了:
INSERT INTO COUNTRY1 SELECT '2', 'two ' FROM RDB$DATABASE UNION ALL SELECT '4', 'four' FROM RDB$DATABASE UNION ALL SELECT '5', 'five' FROM RDB$DATABASE
编辑
正如我所评论的,UNION
当与INSERT ... SELECT
.
使用子选择可能会起作用:
INSERT INTO COUNTRY1
SELECT column1, column2 FROM (
SELECT '2' AS column1, 'two ' AS column2 FROM RDB$DATABASE
UNION ALL SELECT '4', 'four' FROM RDB$DATABASE
UNION ALL SELECT '5', 'five' FROM RDB$DATABASE
)
编辑 2
我刚刚使用下面的代码对其进行了测试,它可以工作:插入了预期的行:
static void Main(string[] args)
{
var constrBuilder = new FbConnectionStringBuilder();
constrBuilder.DataSource = "localhost";
constrBuilder.Database = @"D:\data\db\testdatabase.fdb";
constrBuilder.UserID = "sysdba";
constrBuilder.Password = "masterkey";
string constr = constrBuilder.ToString();
using (var con = new FbConnection(constr))
{
con.Open();
using (var trans = con.BeginTransaction())
{
var cmd = new FbCommand();
cmd.CommandText = "INSERT INTO COUNTRY1 SELECT '2', 'two ' FROM RDB$DATABASE UNION ALL SELECT '4', 'four' FROM RDB$DATABASE UNION ALL SELECT '5', 'five' FROM RDB$DATABASE";
cmd.Connection = con;
cmd.Transaction = trans;
cmd.ExecuteNonQuery();
trans.Commit();
}
}
}