2014-02-16 10 views
0

Я пытаюсь создать хранимую процедуру из C# в Firebird 2.1. Код:Firebird: изменить таблицу и создать хранимую процедуру из C#

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

DDL не разрешен в PSQL (хранимые процедуры, триггеры, блок выполнения), поэтому выполнение ALTER TABLE как это отклонено.

Также SET TERM не является частью синтаксиса инструкции Firebird. Он специфичен для таких инструментов запросов, как isql и FlameRobin, поскольку они используют терминаторы операторов, такие как ;, чтобы знать, когда они заканчиваются, и их можно отправить на сервер. При выполнении блоков PSQL эти инструменты должны следить за другим терминатором терминалов, чтобы помешать им отправлять неполные операторы на сервер. В фактическом синтаксисе оператора Firebird ; является лишь частью блоков PSQL.

Вам необходимо будет выполнить ALTER TABLE и CREATE PROCEDURE отдельно без EXECUTE BLOCK.

+0

Привет, Марк, потребовалось некоторое время, чтобы вернуться к этому, но я его протестировал, и он отлично работает. Еще раз спасибо за помощь. – Giancarlo