我正在尝试从out C#创建一个存储过程到FireBird2.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
一定是很小的东西,但我拿不到。
发布于 2014-02-17 08:23:25
在PSQL中不允许DDL (存储过程、触发器、执行块),因此拒绝执行这样的ALTER TABLE。
另外,SET TERM不是Firebird语句语法的一部分。它特定于查询工具(如isql和FlameRobin ),因为它们使用语句终止符(如; )来知道何时到达语句的结束并可以发送到服务器。在执行PSQL块时,这些工具需要监视不同的语句终止符,以防止它们向服务器发送不完整的语句。在实际的Firebird语句语法中,;只是PSQL块的一部分。
您需要单独执行ALTER TABLE和CREATE PROCEDURE,而不需要EXECUTE BLOCK。
https://stackoverflow.com/questions/21814366
复制相似问题