我试图从C#创建存储过程到Firebird 2.1。 代码是:
String sql = @"EXECUTE BLOCK AS BEGIN " +
"ALTER TABLE EXAMPLE ALTER FIELD1 TYPE Char(50); " +
"SET TERM ^ ; CREATE PROCEDURE name ( input_parameter_name < datatype>, ... )" +
"RETURNS ( output_parameter_name < datatype>, ... ) AS DECLARE VARIABLE variable_name < datatype>;" +
"BEGIN /* write your code here */ END^ SET TERM ; ^" +
" END";
public int Execute(string sql)
{
int result = 0;
if (this.OpenConnection() == true)
{
FbTransaction transaction = Fbconnection.BeginTransaction();
try
{
FbCommand command = new FbCommand(sql, Fbconnection, transaction);
int rc = command.ExecuteNonQuery();
result = rc;
transaction.Commit();
}
catch (Exception e)
{
globals.logfile.log(e.ToString());
globals.logfile.flush();
result = 0;
}
finally
{
this.CloseConnection();
}
}
return result;
}
给出的错误信息是:
FirebirdSql.Data.FirebirdClient.FbException(0x80004005):
动态SQL错误SQL错误代码= -104令牌未知 - 第1行,第24列ALTER
必须是小事,但我无法得到它。
答案 0 :(得分:0)
PSQL中不允许使用DDL(存储过程,触发器,执行块),因此拒绝执行此类ALTER TABLE
。
SET TERM
也不是Firebird语句语法的一部分。它特定于查询工具,如isql和FlameRobin,因为它们使用语句终结符(如;
)来了解何时到达语句结束并可以将其发送到服务器。执行PSQL块时,这些工具需要监视不同的语句终止符,以防止它们向服务器发送不完整的语句。在实际的Firebird语句中,语法;
只是PSQL块的一部分。
您需要在没有ALTER TABLE
的情况下单独执行CREATE PROCEDURE
和EXECUTE BLOCK
。