0

我正在尝试创建一个从 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

一定是小东西,但我无法得到它。

4

1 回答 1

1

PSQL 中不允许 DDL(存储过程、触发器、执行块),因此ALTER TABLE拒绝执行这样的操作。

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

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

于 2014-02-17T08:23:25.760 回答