Firebird:改变表并从C#中创建存储过程

时间:2014-02-16 16:56:53

标签: c# stored-procedures alter-table firebird2.1

我试图从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

必须是小事,但我无法得到它。

1 个答案:

答案 0 :(得分:0)

PSQL中不允许使用DDL(存储过程,触发器,执行块),因此拒绝执行此类ALTER TABLE

SET TERM也不是Firebird语句语法的一部分。它特定于查询工具,如isql和FlameRobin,因为它们使用语句终结符(如;)来了解何时到达语句结束并可以将其发送到服务器。执行PSQL块时,这些工具需要监视不同的语句终止符,以防止它们向服务器发送不完整的语句。在实际的Firebird语句中,语法;只是PSQL块的一部分。

您需要在没有ALTER TABLE的情况下单独执行CREATE PROCEDUREEXECUTE BLOCK