Plsql 在Firebird中使用Qt存储过程

Plsql 在Firebird中使用Qt存储过程,plsql,qt-creator,firebird,firebird2.1,Plsql,Qt Creator,Firebird,Firebird2.1,下午好, 我从Qt和Firebird数据库开始,完成驱动程序安装过程,并对数据库插入、更新和咨询执行操作。 当我开始制作存储过程并从Qt运行它们时,它们并没有工作。不会失败,总是告诉我们一切都是由自己创造的​​很好,但是数据库没有运行。 我使用Qt2.0.1和Firebird 2.1在Linux中编程 我创建了一个简单的存储过程测试,将其作为表的插入。它通过运行控制台工作,但在尝试运行fromQt时不起作用,并且没有错误。SQL代码为: SET TERM ^ ;CREATE PROCEDURE

下午好, 我从Qt和Firebird数据库开始,完成驱动程序安装过程,并对数据库插入、更新和咨询执行操作。 当我开始制作存储过程并从Qt运行它们时,它们并没有工作。不会失败,总是告诉我们一切都是由自己创造的​​很好,但是数据库没有运行。 我使用Qt2.0.1和Firebird 2.1在Linux中编程 我创建了一个简单的存储过程测试,将其作为表的插入。它通过运行控制台工作,但在尝试运行fromQt时不起作用,并且没有错误。SQL代码为:

SET TERM ^ ;CREATE PROCEDURE AGREEGAR_UNO AS BEGIN insert into JUEGO(CODIGO,ESCRUTINIO,ESTADO,FECHA,HORAINICIO) values (next value for GNECODIGOJUEGO,'111,123,154,169,178','Hi', current_date, current_time);END^SET TERM ; ^
GRANT EXECUTE ON PROCEDURE AGREEGAR_UNO TO SYSDBA;
以下代码将用于从Qt连接到firebird

bool VentanaPrueba::conectar()
{
this->db= QSqlDatabase::addDatabase("QIBASE","Data");
this->db.setDatabaseName("./BD/Data.fdb");
this->db.setPassword("password");
this->db.setUserName("SYSDBA");
if(!db.open())
{
return false;
}
else
return true;
}
这是负责调用过程的代码

void VentanaPrueba::procedimiento()
{
if (!this->db.isOpen()) this->conectar();
if(this->db.isOpen())
{ QSqlQuery procedimiento = QSqlQuery::QSqlQuery(this->db);
bool bandera = procedimiento.prepare("EXECUTE PROCEDURE AGREEGAR_UNO");
QString err = procedimiento.lastError().text();
bool respuesta= procedimiento.exec();
//this->db.commit();
if(!respuesta)
{
this->db.close();
}else
{
procedimiento.finish();
this->db.commit();
this->db.close();
}


}else{
//error
}


}

非常感谢您的帮助。

我不知道这对firebird是否有效,但您可以尝试以下方法:

procedimiento.prepare("BEGIN EXECUTE PROCEDURE AGREEGAR_UNO; END;");
这类似于PL/SQL文章

BEGIN
  EXECUTE PROCEDURE AGREEGAR_UNO;
END;
我使用Qt访问Oracle数据库,必须在其中包含“BEGIN”和“END;”命令。oracle中没有“执行过程”,但Firebird可能需要它。

另外,我使用的是Qt4,所以可能也有区别。

有一种更简单的方法,尽管有点奇怪

在firebird中创建一个存储过程,其中包含一些要挂起的输出变量,以及一个要传递过程调用的VARCHAR(1024)输入变量

并使用过程调用作为字符串参数在Qt中调用它

       SET TERM ^ ;
create PROCEDURE SP_EXECUTE (STMNT varchar(1024) )
    RETURNS (
        INRETURN integer )
    AS
    BEGIN
        execute statement stmnt;
    inReturn=1;
    suspend;
    END^
    SET TERM ; ^
    }
然后在Qt中

procedimiento.prepare("SELECT INRETURN FROM SP_EXECUTE('EXECUTE PROCEDURE AGREEGAR_UNO')");

IBPP或InterBase Plus是一个客户端接口项目,它将Qt与firebird等InterBase数据库系统连接起来。使用它,您可以轻松使用firebird数据库。从或ibpp官方网站下载其源代码包,然后解包。将核心文件夹复制到项目文件夹中。并将这些文件添加到Qt项目中。 阅读完整的指南